構成ファイルで定義するデータファイルによって、InnoDB
システムテーブルスペースが形成されます。これらのファイルは、テーブルスペースを形成するために論理的に連結されます。ストライピングは使用されません。現在、テーブルスペース内のどこにテーブルが割り当てられるかを定義することはできません。新しく作成されたテーブルスペースでは、InnoDB
は最初のデータファイルから領域を割り当てます。
システムテーブルスペースの内部にすべてのテーブルおよびインデックスを格納することによって発生する問題を回避するために、innodb_file_per_table
構成オプションをオンにすることができます。このオプションは、新しく作成された各テーブルを個別のテーブルスペースファイル内に (拡張子 .ibd
で) 格納します。この方法で格納されたテーブルの場合、ディスクファイル内の断片化は減少し、テーブルが切り捨てられると、その領域は InnoDB によって引き続きシステムテーブルスペース内に予約されるのではなく、オペレーティングシステムに返されます。
ページ、エクステント、セグメント、およびテーブルスペース
各テーブルスペースは、データベースページで構成されます。MySQL インスタンス内のテーブルスペースはすべて、同じページサイズを持っています。デフォルトでは、すべてのテーブルスペースが 16K バイトのページサイズを持っています。このページサイズを 8K バイトまたは 4K バイトに減らすには、MySQL インスタンスを作成するときに innodb_page_size
オプションを指定します。
これらのページは、サイズ 1M バイトのエクステント (連続した 64 個の 16K バイトページ、128 個の 8K バイトページ、または 256 個の 4K バイトページ) にグループ化されます。InnoDB
では、テーブルスペース内部の「ファイル」をセグメントと呼びます。(これらのセグメントは、実際に多数のテーブルスペースセグメントが含まれているロールバックセグメントとは異なります。)
セグメントがテーブルスペース内部で拡張される場合、InnoDB
は、そのセグメントに最初の 32 ページを一度に割り当てます。そのあと、InnoDB
は、そのセグメントへのすべてのエクステントの割り当てを開始します。InnoDB
は、データの良好な連続性を保証するために、大きなセグメントには 1 回につき最大 4 つのエクステントを追加できます。
InnoDB
では、各インデックスに 2 つのセグメントが割り当てられます。1 つは B ツリーの非リーフノード用、もう 1 つはリーフノード用です。リーフノードをディスク上で連続した状態に維持すると、これらのリーフノードには実際のテーブルデータが含まれているため、シーケンシャル I/O 操作の性能が向上します。
テーブルスペース内の一部のページにはほかのページのビットマップが含まれているため、InnoDB
テーブルスペース内のいくつかのエクステントは全体としてではなく、個々のページとしてのみセグメントに割り当てることができます。
SHOW TABLE STATUS
ステートメントを発行することによってテーブルスペース内の使用可能な空き領域を求めると、InnoDB
は、テーブルスペース内の確実に空いているエクステントをレポートします。InnoDB
は、常にいくつかのエクステントをクリーンアップやその他の内部の目的のために予約します。これらの予約されたエクステントは空き領域に含まれません。
テーブルからデータを削除すると、InnoDB
は、対応する B ツリーインデックスを短くします。解放された領域をほかのユーザーが使用できるようになるかどうかは、削除のパターンがテーブルスペースに対して個々のページまたはエクステントのどちらを解放するかによって異なります。テーブルを削除したりテーブルのすべての行を削除したりすると、その領域は確実にほかのユーザーに解放されますが、それらの削除された行は、それの行がトランザクションロールバックまたは一貫性読み取りに必要なくなったあと、しばらくして自動的に発生するパージ操作によってのみ物理的に削除されることに注意してください。(セクション14.2.12「InnoDB マルチバージョン」を参照してください。)
テーブルスペースに関する情報を表示するには、テーブルスペースモニターを使用します。セクション14.15「InnoDB モニター」を参照してください。
ページのテーブル行への関連付け
可変長カラム (VARBINARY
、VARCHAR
、BLOB
、および TEXT
) を除き、行の最大長はデータベースページの半分より少し短くなります。つまり、行の最大長は約 8000 バイトです。LONGBLOB
および LONGTEXT
カラムは 4G バイト未満である必要があり、BLOB
および TEXT
カラムを含む行全体の長さは 4G バイト未満である必要があります。
行の長さが 1 ページの半分より短い場合は、行全体がそのページ内にローカルに格納されます。それが 1 ページの半分を超える場合は、行が 1 ページの半分内に収まるまで、外部のオフページストレージとして可変長カラムが選択されます。オフページストレージとして選択されたカラムの場合、InnoDB
は最初の 768 バイトをその行にローカルに格納し、残りを外部のオーバーフローページに格納します。このような各カラムには、オーバーフローページの独自のリストがあります。768 バイトのプリフィクスには、そのカラムの実際の長さを格納し、値の残りの部分が格納されているオーバーフローページリストを指す 20 バイトの値が付随します。