行とそれに関連付けられたカラムのストレージが、クエリーや DML 操作のパフォーマンスに影響を与えます。1 つのディスクページに収まる行数が多いほど、クエリーやインデックスルックアップの処理は速くなり、InnoDB バッファープールで必要なキャッシュメモリーは減り、数値カラムや短い文字列カラムの更新された値を書き出すために必要な I/O も少なくなります。
各 InnoDB テーブル内のデータは、ページに分割されます。各テーブルを構成するページは、B ツリーインデックスと呼ばれるツリーデータ構造で配置されます。テーブルデータとセカンダリインデックスはどちらも、このタイプの構造を使用します。テーブル全体を表す B ツリーインデックスは、クラスタ化されたインデックスと呼ばれます。これは、主キーカラムに従って編成されます。インデックスデータ構造のノードには、その行内のすべてのカラム (クラスタ化されたインデックスの場合)、またはインデックスカラムと主キーカラム (セカンダリインデックスの場合) の値が含まれています。
可変長カラムは、このルールの例外です。B ツリーページに収めるには長すぎる BLOB
や VARCHAR
などのカラムは、オーバーフローページと呼ばれる、個別に割り当てられたディスクページに格納されます。このようなカラムを、オフページカラムと呼びます。これらのカラムの値は、オーバーフローページの片方向リンクリストに格納され、このような各カラムには 1 つ以上のオーバーフローページの独自のリストがあります。場合によっては、ストレージの浪費を避け、また個別のページを読み取る必要をなくすために、長いカラム値のすべてまたはプリフィクスが B ツリーに格納されます。
次のセクションでは、これらの可変長カラムを表す方法を制御するために CREATE TABLE
および ALTER TABLE
ステートメントで使用できる句である ROW_FORMAT
と KEY_BLOCK_SIZE
について説明します。これらの句を使用するには、innodb_file_per_table
および innodb_file_format
構成オプションの設定の変更も必要になる可能性があります。