MySQL行格式:固定和动态之间的区别?
MySQL根据列数据类型将表的行格式指定为固定或者动态。如果表具有可变长度的列数据类型,例如TEXT或者VARCHAR,则行格式是动态的;否则,行格式是动态的。否则,它是固定的。
我的问题是,两行格式之间有什么区别?一个比另一个更有效吗?
解决方案
固定表示每行大小完全相同。这意味着,如果需要加载数据页上的第三行,它将恰好位于PageHeader + 2 * RowSize,从而节省了一些访问时间。
为了找到动态记录的开始,必须查询记录偏移量列表,这涉及额外的间接寻址。
简而言之,是的,动态行的性能受到轻微影响。不,这不是很大。如果我们认为这将是一个问题,请对其进行测试。
当我们更新记录时,会发生一个关键的区别。如果行格式是固定的,则记录的长度不变。相反,如果行格式是动态的,并且新数据导致记录的长度增加,则使用链接来指向"溢出"数据(即,它称为溢出指针)。
这会使表碎片化,并且通常会使事情变慢。有一个要进行碎片整理的命令(OPTIMIZE TABLE),这在某种程度上减轻了该问题。
固定应该比动态更快,更安全,但缺点是具有固定字符长度。
我们可以在这里找到此信息:http://dev.mysql.com/doc/refman/5.0/en/static-format.html
差异实际上仅对MyISAM有意义,其他存储引擎并不关心该差异。
编辑:许多用户评论InnoDB确实关心:链接1由Steampowered,链接2由Kaan。
使用具有固定宽度的行的MyISAM,有一些优点:
- 没有行碎片:可变宽度的行可以将单个行拆分为整个数据文件的多个部分。这会增加磁盘查找次数并减慢操作速度。可以使用OPTIMIZE TABLE对其进行碎片整理,但这并不总是可行的。
- 数据文件指针大小:在MyISAM中,有一个数据文件指针的概念,它在需要引用数据文件时使用。例如,当索引引用该行实际存在的位置时,将在索引中使用此字段。对于固定宽度的大小,此指针基于文件中的行偏移量(即,行的大小为1、2、3)。在宽度可变的情况下,指针基于字节偏移量(即行可能是1、57、163)。结果是,对于大表,指针需要更大,这可能会增加表的开销。
- 在腐败的情况下更容易修复。由于每一行的大小相同,因此如果MyISAM表损坏,则修复起来容易得多,因此,我们只会丢失实际损坏的数据。从理论上讲,使用可变宽度时,可变宽度指针可能会被弄乱,这可能导致以不良方式存储数据。
现在,固定宽度的主要缺点是浪费更多的空间。例如,我们需要使用CHAR字段而不是VARCHAR字段,因此最终会占用额外的空间。
通常,格式不会有太多选择,因为它是根据架构决定的。但是,如果我们只有几个varchar或者单个blob /文本来尝试对此进行优化,则可能是值得的。例如,考虑将唯一的varchar切换为char,或者将blob拆分为它自己的表。
我们可以在以下位置阅读有关此内容的更多信息:
http://dev.mysql.com/doc/refman/5.0/en/static-format.html
http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html