是否应经常访问包含具有一对一关系的大blob的表,并将列拆分为两个表?

时间:2014-01-15 12:21:57

标签: mysql performance blob

我有一个频繁访问的表,其中包含3列blob和4列额外数据,这些数据未在查询中使用,但只是作为结果发送给PHP。在WHERE / ORDER BY / GROUP BY中的查询中使用了6个小列(big int,small int,tiny int,medium int,medium int,medium int)。

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

将这个大表分成两个是否是一个很好的解决方案? 一个表包含最后6列,另一个表包含blob和额外数据,并使用具有一对一关系的外键将其链接到上一个表? 然后我将在小表上运行查询,并在使用blob和额外数据过滤到表后将剩余的少量行连接到PHP。

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

1 个答案:

答案 0 :(得分:2)

您实施的内容有时称为“垂直分区”。如果你把它发挥到极致,那么它就是柱状数据库的基础,比如Vertica。

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

缺点是更新,插入和删除。将所有数据放在一行中,这些操作基本上都是原子的 - 也就是说,操作只影响数据页中的一行。 (这对于blob来说并不严格,因为它们在多个页面之间分开。)

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

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