由于MyISAM在表上具有可变长度列(varchar, blob),因此我在网上遇到了将varchar列移动到单独表中的建议。
这仍然是InnoDB的问题吗?我不是指在表中引入许多varchar行导致页面分割的情况。我的意思是,你是否应该考虑,例如,将post_text(表中的单个BLOB字段)移动到另一个表中,就InnoDB的性能而言?
据我所知,blob(和text)实际上存储在表外,varchar存储在表内。
varchar不利于读性能,因为每条记录的长度可能是可变的,这使得在记录中查找字段的成本更高。blob很慢,因为必须单独获取值,并且很可能需要从磁盘或缓存中再次读取。
据我所知,InnoDB在这方面没有什么不同,所以我认为性能特征是不变的。
我不认为移动BLOB值真的有帮助——除了减少总体表大小之外,这对性能有积极的影响。varchar是一个不同的故事。你在这里肯定会受益的。如果您的所有列都是定义长度(我猜这意味着您也不能使用blob ?)字段查找将更快。
如果你只是"阅读"VARHCAR和BLOB字段,我想说这值得一试。但是,如果您的选择查询需要比较来自VARCHAR或BLOB的值,那就非常糟糕了。
所以,是的,你肯定可以在这里获得性能,但要确保你测试你确实获得了性能,并且这种提高值得积极的反规范化。
PS。另一种"优化"VARCHAR读性能的方法是简单地用CHAR字段(固定长度)替换它们。只要磁盘空间的增加是可以接受的,这可以提高读性能。
InnoDB数据与MyISAM完全不同。
在MyISAM中,所有索引——主索引或其他索引——都存储在MYI文件中,并包含指向存储在MYD文件中的数据的指针。变长行不应该直接影响查询速度,但是变长行确实会使MYD文件变得更加碎片化,因为删除一行时留下的空洞不一定会与下一个插入的行一起归档。如果您更新一个可变长度的值以使其变长,则可能必须将其移到其他地方,这意味着随着时间的推移,它可能会相对于索引变得无序,从而使范围查询变慢。(如果您在旋转磁盘上运行它,其中查找时间很重要)。
InnoDB在主键上的b树中以页的形式存储数据。无论使用BLOB还是VARCHAR,只要数据适合页面,它就存储在页面中。只要您不试图定期插入超长的值,那么无论您的行是固定长度还是可变长度都无关紧要。