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

MySQL行格式:固定和动态的区别?,mysql,table-structure,Mysql,Table Structure,MySQL根据列数据类型将表的行格式指定为固定或动态。如果表具有可变长度的列数据类型,如TEXT或VARCHAR,则行格式是动态的;否则,它是固定的 我的问题是,这两种行格式有什么区别?一行比另一行有效吗?固定意味着每一行的大小完全相同。这意味着,如果需要加载数据页上的第三行,它将恰好处于PageHeader+2*行大小,从而节省一些访问时间 为了找到动态记录的开头,必须查阅记录偏移列表,这涉及到额外的间接寻址 简而言之,是的,动态行的性能受到了轻微的影响。不,不是很大。如果您认为这将是一个问题

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


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

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

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


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

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


这会使桌子碎裂,通常会减慢速度。有一个用于碎片整理(优化表)的命令,这在一定程度上缓解了这个问题。

固定的应该比动态的更快、更安全,缺点是具有固定的字符长度。
您可以在这里找到以下信息:

差异实际上只对MyISAM重要,其他存储引擎并不关心差异。 编辑:许多用户评论说InnoDB确实关心:

对于具有固定宽度行的MyISAM,有几个优点:

  • 无行碎片:对于可变宽度的行,可以在数据文件中将单行拆分为多个部分。这会增加磁盘搜索并降低操作速度。可以使用优化表对其进行碎片整理,但这并不总是可行的

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

  • 在发生腐败的情况下更容易修复。由于每一行的大小都相同,因此,如果MyISAM表损坏,则更容易修复,因此只会丢失实际损坏的数据。对于可变宽度,从理论上讲,可变宽度指针可能会弄乱,这可能导致以错误的方式处理数据

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

    通常,您在格式上没有太多选择,因为它是基于模式指定的。然而,如果您只有几个varchar或一个blob/text来尝试为此进行优化,这可能是值得的。例如,考虑将唯一的VARCHAR转换成字符,或者将BLUB拆分到它自己的表中。 您可以通过以下网址了解更多信息:


    MySQL文档中的这一页似乎与这里的首要答案相矛盾,因为动态行格式对InnoDB表也有意义:


    中间一段是真的吗?这似乎与公认的答案相矛盾。(即:指针大小只是更大,而不是额外的间接级别)表明动态行格式对InnoDB也有意义。另一篇文章指出动态行格式对InnoDB有意义:我测试了将10000条记录插入到一个“row_size=282B”的表中“.使用InnoDB,几乎需要500秒;使用MyISAM和内存,大约需要2.97秒。@Victor-您可能有在任何事务上同步到磁盘的设置,并且每个事务可能有一个插入。InnoDB的运行速度比这要快得多。已从InnoDB的MySQL 5.7中删除了FIXED