もし MyISAM
テーブルが可変長カラムを含んでいる場合(VARCHAR
、
VARBINARY
、
BLOB
、または
TEXT
)、または
ROW_FORMAT=DYNAMIC
テーブルオプションで作成された場合は、動的ストレージフォーマットが使用されます。
動的フォーマットは、それぞれの行にその長さを示すヘッダーがあるので、静的フォーマットよりも少しだけ複雑です。更新の結果行が長くなった時には、フラグメント化する事ができます。(非連続単位での格納)
テーブルをデフラグメント化する為に
OPTIMIZE TABLE
か myisamchk
-r
を使用する事ができます。頻繁にアクセスや変更がある固定長カラムが、可変長カラムも含むテーブルの中にあるなら、フラグメント化を防ぐ為に、可変長カラムを他のテーブルに移動するとよいでしょう。
動的フォーマットにはこれらの特徴があります。
長さが4以下の物以外の全ての文字列カラムは動的カラムです。
それぞれの行の先頭には、どのカラムが空文字列(文字列カラム)なのか、またはゼロ(数字カラム)なのかを示すビットマップが付いています。NULL
値を含むカラムは、これに含まれていない事を覚えておいてください。後続スペースの除去をした後に文字列カラムの長さがゼロになったり、数字カラムの値がゼロだったりすると、それらはビットマップの中でマークが付けられ、ディスク上には保存されません。空ではない文字列は、長さバイトに加えて文字列コンテンツとして保存されます。
通常、固定長テーブルに比べると少量のディスク容量を必要とします。
それぞれの行は、必要とする容量のみを使用します。しかし、行が大きくなれば、要求されただけの単位に分割され、行のフラグメント化が行われます。例えば、行の長さを延長する情報を使って行を更新すると、その行はフラグメント化されます。このような場合は、性能を上げるために
OPTIMIZE TABLE
か 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
-edを利用してリンク数を確認する事ができます。OPTIMIZE
TABLE
か myisamchk
-rを使って全てのリンクを除去する事ができます。