相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


18.2.3.2 动态表特征

如果 MyISAM 表包含任何变长列 (VARCHARVARBINARYBLOBTEXT),或者如果表是使用 ROW_FORMAT=DYNAMIC 表选项创建的,则使用动态存储格式。

动态格式比静态格式稍微复杂一些,因为每行都有一个标头,指示它的长度。当行由于更新而变长时,行可能会变得碎片化(存储在非连续的块中)。

您可以使用 OPTIMIZE TABLEmyisamchk -r 对表进行碎片整理。如果您在包含一些变长列的表中拥有经常访问或更改的定长列,那么最好将变长列移到其他表中,以避免碎片化。

动态格式表具有以下特征

  • 所有字符串列都是动态的,除了长度小于四的字符串列。

  • 每行前面都有一个位图,指示哪些列包含空字符串(对于字符串列)或零(对于数字列)。这并不包括包含 NULL 值的列。如果字符串列在去除尾部空格后长度为零,或者数字列的值为零,则在位图中进行标记,并且不会保存到磁盘。非空字符串保存为长度字节加上字符串内容。

  • NULL 列需要在行中占用额外的空间来记录其值是否为 NULL。每个 NULL 列会额外占用一个位,向上取整到最接近的字节。

  • 通常比定长表需要的磁盘空间少得多。

  • 每行仅使用所需的那么多的空间。但是,如果行变大了,它将被分割成所需数量的块,导致行碎片化。例如,如果您使用会扩展行长度的信息更新行,则行会变得碎片化。在这种情况下,您可能需要定期运行 OPTIMIZE TABLEmyisamchk -r 以提高性能。使用 myisamchk -ei 获取表统计信息。

  • 在崩溃后比静态格式表更难重建,因为行可能被分割成许多块,并且链接(块)可能丢失。

  • 动态大小行的预期行长使用以下表达式计算

    3
    + (number of columns + 7) / 8
    + (number of char columns)
    + (packed size of numeric columns)
    + (length of strings)
    + (number of NULL columns + 7) / 8

    每个链接会产生 6 个字节的开销。每次更新导致行增大时,动态行就会被链接。每个新的链接至少是 20 个字节,因此下次增大可能会在同一个链接中。如果没有,则会创建一个新的链接。您可以使用 myisamchk -ed 查找链接数。所有链接都可以通过 OPTIMIZE TABLEmyisamchk -r 删除。