次のようにすべての
InnoDB
は、行のデータが格納される「クラスタインデックス」と呼ばれる特別なインデックスを持っています。
テーブルで PRIMARY
KEY
が定義されている場合、InnoDB
はそれをクラスタインデックスとして使用します。
もしテーブルに PRIMARY
KEY
を定義しなければ、MySQL
は主キーとして NOT
NULL
カラムだけを持つ最初の
UNIQUE
インデックスを選択し、InnoDB
がそれをクラスタインデックスとして利用します。
テーブルに PRIMARY
KEY
も適切な
UNIQUE
インデックスも存在していない場合には、InnoDB
の内部で、行 ID
値を含む合成カラム上に隠しクラスタインデックスが生成されます。そのようなテーブルでは、InnoDB
が行に割り当てる ID
に基づいて行の順序付けが行われます。行 ID
は、新しい行が挿入されると単調に増加する
6 バイトのフィールドです。従って、行 ID
によってオーダされた行は物理的に挿入順になっています。
行データはインデックスサーチが導くものと同じページ上にあるので、クラスタインデックスを通しての行へのアクセスは速いです。テーブルのサイズが大きい場合にクラスタインデックスアーキテクチャーを使えば、インデックスレコードとは異なるページに行データを格納するストレージ編成を使用する場合に比べ、ディスク入出力処理の削減を図れる可能性が高くなります。(たとえば
MyISAM
では、データ行に使用されるファイルとインデックスレコードに使用されるファイルは異なる。)
InnoDB
では、非クラスタインデックス
(二次インデックスとも呼ばれる)
のレコードに行の主キーカラムが格納されますが、行は二次インデックスには含まれません。InnoDB
は、クラスタインデックス内で行を検索するのにこの主キー値を利用します。主キーが長いと二次インデックスで使用される領域も多くなるので、主キーは短くしたほうが有利です。