Mysql 是否应该规范化包含具有一对一关系的大blob的频繁访问表,并将列拆分为两个表?

Mysql 是否应该规范化包含具有一对一关系的大blob的频繁访问表,并将列拆分为两个表?,mysql,performance,blob,Mysql,Performance,Blob,我有一个经常访问的表,其中包含3列BLOB和4列额外数据,这些数据没有在查询中使用,只是作为结果发送给PHP。WHERE/ORDER BY/GROUP BY查询中使用了6个小列(大int、小int、小int、中int、中int、中int) 服务器的内存非常低,大约1GB,因此缓存不足以提高大型表的性能。我已经为最后6个小栏目编制了索引,但似乎没有什么帮助 把这张大桌子一分为二是个好办法吗? 一个表包含最后6列,另一个表包含blob和额外数据,并使用具有一对一关系的外键将其链接到上一个表? 然后,

我有一个经常访问的表,其中包含3列BLOB和4列额外数据,这些数据没有在查询中使用,只是作为结果发送给PHP。WHERE/ORDER BY/GROUP BY查询中使用了6个小列(大int、小int、小int、中int、中int、中int)

服务器的内存非常低,大约1GB,因此缓存不足以提高大型表的性能。我已经为最后6个小栏目编制了索引,但似乎没有什么帮助

把这张大桌子一分为二是个好办法吗? 一个表包含最后6列,另一个表包含blob和额外数据,并使用具有一对一关系的外键将其链接到上一个表? 然后,我将在小表上运行查询,并将过滤后剩下的少量行与blob和额外数据连接到表中,以将它们返回到PHP


请注意,我已经这样做了,我设法将查询时间从1.2-1.4秒减少到0.1-0.2秒。但是,我不确定我尝试的解决方案是否被认为是良好的实践,或者甚至是可取的?

您所实现的有时被称为“垂直分区”。如果您将其发挥到极致,那么它就是柱状数据库(如Vertica)的基础

正如您所观察到的,这样的分区可以显著提高查询性能。一个原因是处理一行数据需要读取的数据更少

缺点是更新、插入和删除。由于所有数据都在一行中,这些操作基本上是原子操作——也就是说,该操作只影响数据页中的一行。(对于blob来说,这并不是严格的事实,因为它们被分割到多个页面中。)

当您在多个表之间拆分数据时,需要在表之间协调这些操作,这样您就不会得到“部分”数据行


对于使用批量插入和大量查询的数据库,这不是一个特别重要的考虑因素。将单独的数据列拆分为单独的表是提高性能的合理方法。

感谢您的快速回答!是的,正如您所说,插入/更新和删除是一件很难处理的事情。我缺乏经验,对这是否是一个可行的解决方案犹豫不决,这就是为什么我没有完全做到这一点的原因。但是考虑到性能的影响,这似乎是值得的,特别是因为正如您所说,我没有做一些DBA“从不做”列表中真正可怕的事情。