MySQL行格式:固定和dynamic之间的区别?
MySQL根据列数据types将表格的行格式指定为固定或dynamic。 如果一个表具有可变长度的列数据types,例如TEXT或VARCHAR,那么行格式是dynamic的; 否则,它是固定的。
我的问题是,两行格式有什么区别? 比另一个更有效率吗?
这个区别对MyISAM来说只是重要的,其他的存储引擎并不关心这个区别。 编辑:许多用户评论说,InnoDB不在乎: 链接1 steampowered , 链接2由凯恩 。
使用固定宽度行的MyISAM,有一些优点:
-
没有行碎片:可以使用可变宽度的行来将单行分割成数据文件的多个部分。 这可以增加磁盘search速度并减缓操作。 用OPTIMIZE TABLE可以对它进行碎片整理,但这并不总是实用的。
-
数据文件指针大小:在MyISAM中,有一个数据文件指针的概念,在需要引用数据文件时使用。 例如,当它们引用实际存在的行的位置时,这在索引中使用。 对于固定的宽度大小,该指针基于文件中的行偏移量(即行数是1,2,3,而不考虑它们的大小)。 宽度可变,指针是基于字节偏移(即行可能是1,57,163)。 结果是,对于大表,指针需要更大,这会增加表中的开销。
-
在腐败的情况下更容易修复。 由于每一行都是相同的大小,如果你的MyISAM表损坏了,修复起来就容易多了,所以你只会丢失实际上已经损坏的数据。 在宽度可变的情况下,理论上可能的情况是可变宽度指针变得混乱,这可能导致数据混乱。
现在固定宽度的主要缺点是浪费了更多的空间。 例如,您需要使用CHAR字段而不是VARCHAR字段,因此最终会占用额外的空间。
通常情况下,你不会有太多的格式select,因为它是根据模式来决定的。 但是,如果您只有几个varchar或一个blob /文本来尝试优化,可能是值得的。 例如,考虑将唯一的varchar切换到char,或者将blob分割到它自己的表中。
你可以阅读更多关于这个:
更新logging时会出现一个关键区别。 如果行格式是固定的,则logging的长度没有变化。 相反,如果行格式是dynamic的,并且新数据导致logging长度增加,则使用链接指向“溢出”数据(即,它被称为溢出指针)。
这使桌子变得碎片,并且一般会减慢速度。 有一个命令进行碎片整理(OPTIMIZE TABLE),这有点缓解了这个问题。
MySQL的文档中的这个页面似乎与这里的最佳答案相矛盾,因为DYNAMIC行格式也意味着InnoDB表的一些东西:
http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html
固定意味着每一行的大小完全相同。 这意味着,如果数据页面上的第三行需要加载,它将完全处于PageHeader + 2 * RowSize,节省一些访问时间。
为了finddynamiclogging的开始,必须查询logging偏移列表,这涉及额外的间接寻址。
总之,对于dynamic行来说,性能会有轻微的下滑。 不,这不是一个很大的。 如果你认为这将是一个问题,testing它。
固定应该比dynamic更快,更安全,缺点是具有固定的字符长度。 你可以在这里find这个信息: http : //dev.mysql.com/doc/refman/5.0/en/static-format.html