由于MyISAM在表上具有可变长度列(Varchar,Blob)的情况下,确实放慢了查询,因此我在网上遇到了建议,以将VARCHAR列移至单独的表中。

这仍然是InnoDB的问题吗?我的意思不是将许多VARCHAR行引入表格Page Split中的情况。我的意思是,您是否应该考虑,例如,将post_text(表中的单个斑点字段)移动到另一个表中,对InnoDB进行演讲性能?

有帮助吗?

解决方案

据我所知,斑点(和文本)实际上存储在桌子外面,Varchars存储在表中。

Varchars对阅读性能不利,因为每个记录的长度可能会变,并且在记录中找到字段的成本更高。斑点很慢,因为该值必须单独获取,并且很可能需要从磁盘或缓存中读取另一个读取。

据我所知,InnoDB在这方面没有做任何不同的事情,因此我认为性能特征所具有。

我认为移动斑点值并没有真正的帮助 - 除了降低整体桌子尺寸,这对性能都有积极影响。 Varchars是另一个故事。您一定会在这里受益。如果您的所有列都是定义的长度(我想这意味着您也不能使用斑点?)字段查找将更快。

如果您只是“阅读” Varhcar和Blob字段,我会说这值得一试。但是,如果您的选择查询需要比较varchar或blob的值,那么您会很酸。

因此,是的,您肯定可以在这里获得性能,但是请确保您测试您实际上获得了性能,并且增加值得积极的命名。

PS。

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

其他提示

InnoDB数据与Myisam完全不同。

在MyiSam中,所有索引(主要或其他索引)存储在Myi文件中,其中包含一个指向MyD文件中存储的数据的指针。可变长度行不应直接影响查询速度,但是MyD文件确实会变得更加碎片,因为当您删除行时留下的孔不一定会随着您接下来插入的行插入。如果您更新一个可变长度值以使其更长,则可能必须将其移动到其他地方,这意味着它会随着时间的推移而相对于索引,从而使范围查询较慢。 (如果您在寻找时间很重要的旋转磁盘上运行它)。

InnoDB存储在主键的B树中的页面中的数据集群。只要数据适合在页面中,无论您使用BLOB还是VARCHAR,都将存储在页面中。只要您不尝试定期插入漫长的值,无论行是固定长度还是可变长度,都不重要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top