MySQL行格式:固定和动态之间的区别?

时间:2008-09-29 02:25:28

标签: mysql table-structure

MySQL将表的行格式指定为固定或动态,具体取决于列数据类型。如果表具有可变长度列数据类型,例如TEXT或VARCHAR,则行格式是动态的;否则,它是固定的。

我的问题是,两种行格式之间的区别是什么?一个比另一个更有效吗?

5 个答案:

答案 0 :(得分:57)

差异真的只对MyISAM很重要,其他存储引擎并不关心差异。 编辑:许多用户评论说InnoDB非常关注:link 1 by steampoweredlink 2 by Kaan

MyISAM具有固定宽度的行,有一些优点:

  1. 没有行碎片:可变宽度行可以将单行拆分为数据文件中的多个部分。这可以增加磁盘搜索并减慢操作。可以使用OPTIMIZE TABLE对其进行碎片整理,但这并不总是切实可行。

  2. 数据文件指针大小:在MyISAM中,有一个数据文件指针的概念,在需要引用数据文件时使用。例如,当它们引用行实际存在的位置时,它在索引中使用。对于固定宽度大小,此指针基于文件中的行偏移(即行数为1,2,3,无论其大小如何)。对于可变宽度,指针基于字节偏移(即行可能是1,57,163)。结果是,对于大型表,指针需要更大,这可能会给表增加更多的开销。

  3. 在腐败的情况下更容易修复。由于每行的大小相同,如果MyISAM表损坏,则修复起来要容易得多,因此您只会丢失实际损坏的数据。在宽度可变的情况下,理论上可变宽度指针可能会混乱,这可能会导致数据输入方式不正确。

  4. 现在固定宽度的主要缺点是浪费更多空间。例如,您需要使用CHAR字段而不是VARCHAR字段,因此最终会占用额外的空间。

    通常,您在格式上没有太多选择,因为它是根据架构决定的。但是,如果你只有一些varchar或一个blob / text来尝试优化它,那么它可能是值得的。例如,考虑将唯一的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

答案 1 :(得分:10)

更新记录时会出现一个关键差异。如果行格式是固定的,则记录的长度没有变化。相反,如果行格式是动态的并且新数据导致记录的长度增加,则使用链接指向“溢出”数据(即,它称为溢出指针)。

这会破坏表格,通常会减慢速度。有一个碎片整理命令(OPTIMIZE TABLE),这有点缓解了这个问题。

答案 2 :(得分:7)

MySQL的文档中的这个页面似乎与这里的最佳答案相矛盾,因为DYNAMIC行格式也意味着InnoDB表的内容:

http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html

答案 3 :(得分:4)

固定意味着每一行的大小完全相同。这意味着如果需要加载数据页面上的第3行,它将完全处于PageHeader + 2 * RowSize,从而节省了一些访问时间。

为了找到动态记录的开头,必须查阅记录偏移列表,这涉及额外的间接。

简而言之,是的,动态行的性能略有下降。不,这不是一个很大的问题。如果您认为这将是一个问题,请测试它。

答案 4 :(得分:1)

固定应该比动态更快,更安全,缺点是具有固定的字符长度。 您可以在此处找到此信息:http://dev.mysql.com/doc/refman/5.0/en/static-format.html