この形式は、テーブルに
VARCHAR
、BLOB
、または
TEXT
カラムが含まれている場合、あるいはテーブルが
ROW_FORMAT=dynamic
で作成された場合に使用されます。
この形式は少し複雑です。各レコードにそれぞれの長さを記録したヘッダが必要となるからです。1 つのレコードが、更新によって長くなったために、複数の場所に存在することになる可能性もあります。
OPTIMIZE table
または
myisamchk
を使用して、テーブルをデフラグメント化することができます。VARCHAR
または BLOB
カラムと同じテーブル内に、頻繁にアクセス/変更する静的データがある場合は、フラグメント化を回避するために動的なカラムを他のテーブルに移動するとよいでしょう。
文字列カラムはすべて動的である(長さが 4 バイト未満のものを除く)。
各レコードの先頭には、どの文字列カラムが空白(''
)で、どの数値カラムがゼロであるかを示すビットマップが付いている(NULL
値を含んだカラムとは異なる)。文字列カラムで後続の空白を取り除いた後の長さがゼロになった場合、または数値カラムの値がゼロである場合は、それらのカラムがビットマップでマークされ、ディスクに保存されない。空白でない文字列は、長さが記録されたバイトに文字列の内容を付加して保存される。
通常は、使用するディスク領域が固定長テーブルに比べてはるかに少ない。
各レコードは、要求されただけの領域を使用する。レコードが大きくなると、必要に応じてそのレコードが断片に分割される。その結果、レコードのフラグメント化が生じる。
レコードの更新によってレコードの長さが拡張されると、そのレコードがフラグメント化される。この場合は、myisamchk
-r
をときどき実行して、パフォーマンスを高める必要がある。一部の統計情報には、myisamchk
-ei tbl_name
を使用する。
レコードが細かくフラグメント化され、リンク(フラグメント)が失われている可能性があるため、クラッシュ後の再構築は容易ではない。
動的なサイズのレコードについては、予期されるレコードの長さを次の方法で算出できる。
3 + (フィールド数 + 7) / 8 + (char カラムの数) + 数値カラムをパックしたサイズ + 文字列の長さ + (NULL カラムの数 + 7) / 8
各リンクには 6
バイトのペナルティがある。動的レコードは、更新によってレコードが拡張されるたびにリンクされる。新しいリンクは少なくともそれぞれ
20
バイトあるため、次回の拡張は同じリンクで行われると考えられる。そうでない場合は、新たなリンクが発生する。リンクの数は、myisamchk
-ed
でチェックできる。すべてのリンクを削除するには、myisamchk
-r
を使用する。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.