MySQL行格式:固定和动态的区别?
MySQL根据列数据类型将表的行格式指定为固定或动态。如果表具有可变长度的列数据类型,如TEXT或VARCHAR,则行格式是动态的;否则,它是固定的MySQL行格式:固定和动态的区别?,mysql,table-structure,Mysql,Table Structure,MySQL根据列数据类型将表的行格式指定为固定或动态。如果表具有可变长度的列数据类型,如TEXT或VARCHAR,则行格式是动态的;否则,它是固定的 我的问题是,这两种行格式有什么区别?一行比另一行有效吗?固定意味着每一行的大小完全相同。这意味着,如果需要加载数据页上的第三行,它将恰好处于PageHeader+2*行大小,从而节省一些访问时间 为了找到动态记录的开头,必须查阅记录偏移列表,这涉及到额外的间接寻址 简而言之,是的,动态行的性能受到了轻微的影响。不,不是很大。如果您认为这将是一个问题
我的问题是,这两种行格式有什么区别?一行比另一行有效吗?固定意味着每一行的大小完全相同。这意味着,如果需要加载数据页上的第三行,它将恰好处于PageHeader+2*行大小,从而节省一些访问时间 为了找到动态记录的开头,必须查阅记录偏移列表,这涉及到额外的间接寻址
简而言之,是的,动态行的性能受到了轻微的影响。不,不是很大。如果您认为这将是一个问题,请测试它。更新记录时会出现一个关键差异。如果行格式是固定的,则记录的长度没有变化。相反,如果行格式是动态的,并且新数据导致记录长度增加,则使用链接指向“溢出”数据(即,它被称为溢出指针)
这会使桌子碎裂,通常会减慢速度。有一个用于碎片整理(优化表)的命令,这在一定程度上缓解了这个问题。固定的应该比动态的更快、更安全,缺点是具有固定的字符长度。
您可以在这里找到以下信息:差异实际上只对MyISAM重要,其他存储引擎并不关心差异。 编辑:许多用户评论说InnoDB确实关心: 对于具有固定宽度行的MyISAM,有几个优点:
MySQL文档中的这一页似乎与这里的首要答案相矛盾,因为动态行格式对InnoDB表也有意义:
中间一段是真的吗?这似乎与公认的答案相矛盾。(即:指针大小只是更大,而不是额外的间接级别)表明动态行格式对InnoDB也有意义。另一篇文章指出动态行格式对InnoDB有意义:我测试了将10000条记录插入到一个“row_size=282B”的表中“.使用InnoDB,几乎需要500秒;使用MyISAM和内存,大约需要2.97秒。@Victor-您可能有在任何事务上同步到磁盘的设置,并且每个事务可能有一个插入。InnoDB的运行速度比这要快得多。已从InnoDB的MySQL 5.7中删除了FIXED