# 16.2.3.2 动态表特征
使用动态存储格式,如果MyISAM
表包含任何可变长度列 (VARCHAR
,变量
,斑点
, 要么文本
),或者如果表是使用ROW_FORMAT=动态
表选项。
动态格式比静态格式稍微复杂一点,因为每一行都有一个标头来指示它的长度。当由于更新而使行变长时,行可能会变得碎片化(存储在不连续的片段中)。
您可以使用优化表
要么myisamchk -r对表进行碎片整理。如果您在还包含一些可变长度列的表中经常访问或更改固定长度列,则最好将可变长度列移动到其他表中以避免碎片。
动态格式表具有以下特征:
除长度小于四的字符串外,所有字符串列都是动态的。
每行前面都有一个位图,指示哪些列包含空字符串(对于字符串列)或零(对于数字列)。这不包括包含
空值
价值观。如果删除尾随空格后字符串列的长度为零,或者数字列的值为零,则它会在位图中进行标记并且不会保存到磁盘。非空字符串保存为长度字节加上字符串内容。空值
列在行中需要额外的空间来记录它们的值是否空值
.每个空值
column 需要额外的一位,四舍五入到最接近的字节。与固定长度表相比,通常需要更少的磁盘空间。
每行仅使用所需的空间。但是,如果一行变大,它会被拆分为所需的多个部分,从而导致行碎片。例如,如果您使用扩展行长度的信息更新行,则该行将变得碎片化。在这种情况下,您可能需要运行
优化表
要么myisamchk -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 编辑.所有链接都可以删除
优化表
要么myisamchk -r.