代码之家  ›  专栏  ›  技术社区  ›  moo

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

  •  45
  • moo  · 技术社区  · 17 年前

    MySQL根据列数据类型,将表的行格式指定为固定格式或动态格式。如果一个表有一个可变长度的列数据类型,例如text或varchar,那么行格式是动态的;否则,它是固定的。

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

    5 回复  |  直到 11 年前
        1
  •  56
  •   Byson    11 年前

    这种差别对Myisam来说真的很重要,其他的存储引擎不在乎差别。 编辑: 许多用户评论说InnoDB确实关心: link 1 by steampowered , link 2 by Kaan .

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

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

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

    3. 在腐败的情况下更容易修复。因为每一行的大小都相同,所以如果您的myisam表损坏了,修复起来就容易得多,所以您只会丢失实际损坏的数据。对于可变宽度,理论上可能是可变宽度指针弄乱了,这会导致以错误的方式承载数据。

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

    通常情况下,您在格式上没有太多选择,因为它是根据模式指定的。但是,如果您只有几个varchar或单个blob/text来尝试对此进行优化,那么可能是值得的。例如,考虑将唯一的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

        2
  •  10
  •   Ben Hoffstein    17 年前

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

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

        3
  •  7
  •   B T    14 年前

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

    http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html

        4
  •  4
  •   Jonathan Rupp    17 年前

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

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

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

        5
  •  1
  •   jmissao    17 年前

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