MySQLの複合インデックス(コンポジットインデックス)とは?特徴と作成方法を解説
複合インデックス(コンポジットインデックス)とは、複数のカラムに対して設定されるインデックスのことです。マルチカラムインデックスとも呼ばれます。単一カラムのインデックスでは対応しきれない検索条件を効率化できるため、実務でも頻繁に活用される重要な機能です。
複合インデックスの主な特徴
複合インデックスには、以下のような特徴があります。
MySQLでは、最大16個のカラムで構成される複合インデックスを作成できます。
クエリオプティマイザは、インデックスに含まれるすべてのカラムが検索条件で使われるクエリに対して、複合インデックスを利用します。
さらに、先頭の1カラムだけ、先頭の2カラムなど、部分的なカラム組み合わせの検索にも利用可能です。
インデックス定義時にカラムを適切な順序で指定しておけば、1つの複合インデックスだけで同一テーブルへのさまざまな種類のクエリを高速化できます。
このように、複合インデックスは「左端から連続するカラム」に対して有効に働くという特性(左端プレフィックスの法則)を持っています。
テーブル作成時に複合インデックスを作成する
テーブルを作成するタイミングで複合インデックスを定義することもできます。その場合は、以下のようなCREATE TABLE文を使用します。
CREATE TABLE table_name ( c1 data_type PRIMARY KEY, c2 data_type, c3 data_type, c4 data_type, INDEX index_name (c2,c3,c4) );
上記の例では、c2・c3・c4の3つのカラムで構成される複合インデックス「index_name」を作成しています。
既存テーブルにCREATE INDEX文で追加する
すでに存在するテーブルに対しては、「CREATE INDEX」文を使って後から複合インデックスを追加することもできます。
CREATE INDEX index_name ON table_name(c2,c3,c4);
利用可能なカラムの組み合わせ
たとえば、(c1, c2, c3) の順で複合インデックスを作成した場合、以下のカラム組み合わせの検索に対してインデックスが有効になります。
(c1) (c1,c2) (c1,c2,c3)
一方で、(c2) や (c2, c3)、(c3) のように先頭カラムであるc1を含まない検索条件では、このインデックスは利用されません。そのため、複合インデックスを設計する際は、実際に実行されるクエリのWHERE句やJOIN条件で使われるカラムの出現順序を考慮し、最も選択性の高いカラムを先頭に配置することがパフォーマンス向上のポイントとなります。
-
MySQLでGROUP BYとHAVINGを使って重複行を検出する方法
MySQLでテーブル内の重複行を見つけるには、GROUP BY句とHAVING句を組み合わせるのが最も基本的かつ効果的な方法です。この記事では、サンプルテーブルを作成し、実際に重複データを検出する手順をわかりやすく解説します。1. サンプルテーブルの作成まず、出荷日(ShippingDate)と顧客の国名(CustomerCountryName)を持つテーブルを作成します。mysql> create table DemoTable1494-> (-> ShippingDate datetime,-> CustomerCountryName varchar(20)->
-
MySQLの複合インデックスで低速クエリを高速化する方法
複合インデックス(Composite Index)とはまず、複合インデックスの基本について確認しておきましょう。複合インデックスとは、複数のカラムに対して設定されるインデックスのことです。「マルチカラムインデックス(複数カラムインデックス)」とも呼ばれます。MySQLでは、最大16カラムまでを含む複合インデックスを作成できます。クエリオプティマイザは、インデックスに含まれるすべてのカラムを条件として参照するクエリに対して、複合インデックスを活用します。さらに、インデックスの先頭カラムのみ、あるいは先頭の2カラムのみを条件とするクエリに対しても使用できます。インデックス定義時にカラムを適切な順序