MyISAM 在表上具有可变长度列(varchar,blob)确实减慢了查询速度,因此我在网上遇到了将 varchar 列移动到单独表中的建议。
这仍然是 InnoDB 的问题吗?我并不是说在表中引入许多 varchar 行会导致页面拆分的情况。我的意思是您是否应该考虑,例如,将 post_text(表中的单个 BLOB 字段)移动到另一个表中,就 InnoDB 的性能而言?
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,它都会存储在页面中。只要您不尝试定期插入过长的值,您的行是固定长度还是可变长度都无关紧要。