MySQL 根据列数据类型将表的行格式指定为固定或动态。如果表具有可变长度列数据类型,例如 TEXT 或 VARCHAR,则行格式是动态的;否则,它是固定的。
我的问题是,两种行格式有什么区别?其中一个比另一个更有效率吗?
这种差异实际上只对 MyISAM 重要,其他存储引擎并不关心这种差异。EDIT :许多用户评论说 InnoDB 确实关心:链接 1 来自 steampowered https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html, 链接 2 卡恩 http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/.
使用固定宽度行的 MyISAM 有一些优点:
无行碎片:使用可变宽度的行可以将单个行分成数据文件中的多个部分。这会增加磁盘寻道并减慢操作速度。可以使用 OPTIMIZE TABLE 对其进行碎片整理,但这并不总是实用。
数据文件指针大小:在MyISAM中,有一个数据文件指针的概念,当需要引用数据文件时使用该指针。例如,当索引引用行实际存在的位置时,这会在索引中使用。对于固定宽度大小,该指针基于文件中的行偏移量(即,行为 1、2、3,无论其大小如何)。对于可变宽度,指针基于字节偏移量(即行可能是 1、57、163)。结果是,对于大型表,指针需要更大,这可能会增加表的开销。
在腐败的情况下更容易修复。由于每一行的大小相同,因此如果您的 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/static-format.html
http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)