49

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

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

4

5 回答 5

59

差异只对 MyISAM 很重要,其他存储引擎并不关心差异。 编辑:许多用户评论说 InnoDB 确实关心:链接 1 由 steampowered链接 2 由 Kaan

使用具有固定宽度行的 MyISAM,有几个优点:

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

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

  3. 在损坏的情况下更容易修复。由于每一行的大小相同,如果您的 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

于 2008-09-29T02:37:48.187 回答
11

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

这会使表格碎片化,通常会减慢速度。有一个碎片整理命令(OPTIMIZE TABLE),这在一定程度上缓解了这个问题。

于 2008-09-29T02:32:48.713 回答
7

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

https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html

于 2012-02-14T19:56:25.057 回答
4

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

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

简而言之,是的,动态行的性能会受到轻微影响。不,它不是一个很大的。如果您认为这将是一个问题,请对其进行测试。

于 2008-09-29T02:30:46.147 回答
1

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

于 2008-09-29T02:33:10.507 回答