#### 16.2.3.2 动态表特征

[](<>)[](<>)

使用动态存储格式，如果`MyISAM`表包含任何可变长度列 ([`VARCHAR`](char.html),[`变量`](binary-varbinary.html),[`斑点`](blob.html)， 要么[`文本`](blob.html))，或者如果表是使用`ROW_FORMAT=动态`表选项。

动态格式比静态格式稍微复杂一点，因为每一行都有一个标头来指示它的长度。当由于更新而使行变长时，行可能会变得碎片化（存储在不连续的片段中）。

[](<>)

您可以使用[`优化表`](optimize-table.html)要么[**myisamchk -r**](myisamchk.html)对表进行碎片整理。如果您在还包含一些可变长度列的表中经常访问或更改固定长度列，则最好将可变长度列移动到其他表中以避免碎片。

动态格式表具有以下特征：

-   除长度小于四的字符串外，所有字符串列都是动态的。

-   每行前面都有一个位图，指示哪些列包含空字符串（对于字符串列）或零（对于数字列）。这不包括包含`空值`价值观。如果删除尾随空格后字符串列的长度为零，或者数字列的值为零，则它会在位图中进行标记并且不会保存到磁盘。非空字符串保存为长度字节加上字符串内容。

-   `空值`列在行中需要额外的空间来记录它们的值是否`空值`.每个`空值`column 需要额外的一位，四舍五入到最接近的字节。

-   与固定长度表相比，通常需要更少的磁盘空间。

-   每行仅使用所需的空间。但是，如果一行变大，它会被拆分为所需的多个部分，从而导致行碎片。例如，如果您使用扩展行长度的信息更新行，则该行将变得碎片化。在这种情况下，您可能需要运行[`优化表`](optimize-table.html)要么[**myisamchk -r**](myisamchk.html)不时提高性能。采用[**myisamchk-ei**](myisamchk.html)获取表统计信息。

-   崩溃后重建比静态格式表更困难，因为行可能会被分割成许多块并且链接（片段）可能会丢失。

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

    ```
    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 编辑**](myisamchk.html).所有链接都可以删除[`优化表`](optimize-table.html)要么[**myisamchk -r**](myisamchk.html).
