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