MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  クラスタインデックスとセカンダリインデックス

15.6.2.1 クラスタインデックスとセカンダリインデックス

すべての InnoDB テーブルは、行のデータが格納されているクラスタ化されたインデックスと呼ばれる特別なインデックスを持っています。 一般に、クラスタ化されたインデックスは主キーのシノニムです。 クエリー、挿入およびその他のデータベース操作から最高のパフォーマンスを得るには、InnoDB がクラスタインデックスを使用して各テーブルの最も一般的な参照および DML 操作を最適化する方法を理解する必要があります。

  • テーブル上で PRIMARY KEY を定義すると、InnoDB ではそれがクラスタ化されたインデックスとして使用されます。 作成するテーブルごとに主キーを定義します。 論理的に一意で、Null 以外のカラムまたはカラムのセットが存在しない場合は、自動的に値が入力される新しい自動インクリメントカラムを追加します。

  • テーブルに PRIMARY KEY が定義されていない場合、MySQL はすべてのキーカラムが NOT NULLUNIQUE インデックスを最初に検索し、InnoDB はそれをクラスタ化されたインデックスとして使用します。

  • テーブルに PRIMARY KEY インデックスまたは適切な UNIQUE インデックスがない場合、InnoDB は、GEN_CLUST_INDEX という名前の非表示のクラスタインデックスを、行 ID 値を含む合成カラムに内部的に生成します。 そのようなテーブルでは、InnoDB が行に割り当てる ID に基づいて行の順序付けが行われます。 行 ID は、新しい行が挿入されると単調に増加する 6 バイトのフィールドです。 したがって、行 ID で順序付けられた行が物理的な挿入順になります。

クラスタ化されたインデックスでクエリーを高速にする方法

クラスタ化されたインデックスから行にアクセスすると、インデックス検索がすべての行データを持つページで直接実行されるため、高速になります。 多くの場合、テーブルのサイズが大きい場合にクラスタ化されたインデックスアーキテクチャーを使用すれば、インデックスレコードとは別のページに行データを格納するストレージ編成と比べて、ディスク I/O 操作を節約できます。

セカンダリインデックスとクラスタ化されたインデックスとの関係

クラスタ化されたインデックス以外のインデックスは、すべてセカンダリインデックスと呼ばれます。 InnoDB では、セカンダリインデックス内の各レコードに、行の主キーカラム、およびセカンダリインデックスに指定されたカラムが含まれます。 InnoDB では、クラスタ化されたインデックス内で行を検索する際に、この主キー値が使用されます。

主キーが長くなると、セカンダリインデックスで使用される領域も多くなるため、主キーは短い方が利点があります。

InnoDB のクラスタインデックスおよびセカンダリインデックスを利用するためのガイドラインは、セクション8.3「最適化とインデックス」 を参照してください。


関連キーワード:  InnoDB, テーブル, インデックス, 構成, クラスタ, 圧縮, スペース, ロック, INFORMATION, SCHEMA