在InnoDB表上有可变长度列的选择吗?

时间:2011-04-27 19:09:43

标签: mysql performance innodb variable-length

MyISAM在表上有可变长度列(varchar,blob)确实减慢了查询速度,因此我在网上遇到了将varchar列移动到单独表中的建议。

这仍然是InnoDB的问题吗?我并不是指在表中引入许多varchar行导致页面拆分的情况。我的意思是,你应该考虑,例如,将post_text(表中的单个BLOB字段)移动到另一个表中,说出InnoDB的性能明智吗?

2 个答案:

答案 0 :(得分:3)

InnoDB数据与MyISAM完全不同。

在MyISAM中,所有索引(主要或其他)都存储在MYI文件中,其中包含指向存储在MYD文件中的数据的指针。可变长度行不应直接直接影响查询速度,但MYD文件确实倾向于使用可变长度行更加碎片化,因为删除行时留下的孔不一定与您接下来插入的行一起归档。如果更新变量长度值以使其更长,则可能必须将其移动到其他位置,这意味着随着时间的推移,它将倾向于无序地进行索引,从而使范围查询变慢。 (如果您在旋转磁盘上运行它,寻找时间很重要。)

InnoDB将群集中的数据存储在主键上的B树中。只要数据适合页面,无论您使用的是BLOB还是VARCHAR,它都会存储在页面中。只要您不打算定期插入过长的值,那么您的行是固定长度还是可变长度都无关紧要。

答案 1 :(得分:2)

据我所知,BLOB(和TEXT)实际存储在表外,VARCHAR存储在表中。

VARCHAR对读取性能不利,因为每条记录的长度可变,这使得在记录中查找字段的成本更高。 BLOB很慢,因为必须单独获取值,并且很可能需要从磁盘或缓存中再次读取。

据我所知,InnoDB在这方面没有做任何不同的事情,所以我假设性能特征保持不变。

我不认为移动BLOB值确实有帮助 - 除了减少整体表大小,这对性能有积极影响。 VARCHAR是一个不同的故事。你肯定会在这里受益。如果你的所有列都是定义的长度(我想这意味着你也不能使用BLOB?),字段查找会更快。

如果您只是“阅读”VARHCAR和BLOB字段,我会说这值得一试。但是如果你的select查询需要比较VARCHAR或BLOB中的值,那你就很糟糕了。

所以是的,你肯定可以在这里获得性能,但要确保你测试你实际上正在获得性能,并且增加值得积极的非规范化。

PS。

“优化”VARCHAR读取性能的另一种方法是简单地用CHAR字段(固定长度)替换它们。只要磁盘空间的增加是可以接受的,这可能有利于读取性能。