すべての InnoDB
テーブルは、行のデータが格納されているクラスタ化されたインデックスと呼ばれる特別なインデックスを持っています。 一般に、クラスタ化されたインデックスは主キーのシノニムです。 クエリー、挿入およびその他のデータベース操作から最高のパフォーマンスを得るには、InnoDB
がクラスタインデックスを使用して各テーブルの最も一般的な参照および DML 操作を最適化する方法を理解する必要があります。
テーブル上で
PRIMARY KEY
を定義すると、InnoDB
ではそれがクラスタ化されたインデックスとして使用されます。 作成するテーブルごとに主キーを定義します。 論理的に一意で、Null 以外のカラムまたはカラムのセットが存在しない場合は、自動的に値が入力される新しい自動インクリメントカラムを追加します。テーブルに
PRIMARY KEY
が定義されていない場合、MySQL はすべてのキーカラムがNOT NULL
のUNIQUE
インデックスを最初に検索し、InnoDB
はそれをクラスタ化されたインデックスとして使用します。テーブルに
PRIMARY KEY
インデックスまたは適切なUNIQUE
インデックスがない場合、InnoDB
は、GEN_CLUST_INDEX
という名前の非表示のクラスタインデックスを、行 ID 値を含む合成カラムに内部的に生成します。 そのようなテーブルでは、InnoDB
が行に割り当てる ID に基づいて行の順序付けが行われます。 行 ID は、新しい行が挿入されると単調に増加する 6 バイトのフィールドです。 したがって、行 ID で順序付けられた行が物理的な挿入順になります。
クラスタ化されたインデックスから行にアクセスすると、インデックス検索がすべての行データを持つページで直接実行されるため、高速になります。 多くの場合、テーブルのサイズが大きい場合にクラスタ化されたインデックスアーキテクチャーを使用すれば、インデックスレコードとは別のページに行データを格納するストレージ編成と比べて、ディスク I/O 操作を節約できます。
クラスタ化されたインデックス以外のインデックスは、すべてセカンダリインデックスと呼ばれます。 InnoDB
では、セカンダリインデックス内の各レコードに、行の主キーカラム、およびセカンダリインデックスに指定されたカラムが含まれます。 InnoDB
では、クラスタ化されたインデックス内で行を検索する際に、この主キー値が使用されます。
主キーが長くなると、セカンダリインデックスで使用される領域も多くなるため、主キーは短い方が利点があります。
InnoDB
のクラスタインデックスおよびセカンダリインデックスを利用するためのガイドラインは、セクション8.3「最適化とインデックス」 を参照してください。