MySQL では複数のカラムに対するインデックスを作成できます。インデックスは最大 16 カラムで構成できます。特定のデータ型に関しては、カラムの接頭辞をインデックス上で検索することができます。項4.4.2. 「カラムインデックス」を参照してください)
複数カラムのインデックス (複合インデックス) は、インデックス化されたカラムの値を連結することによって生成された値が含まれ、ソート化された配列と見なすことができます。
MySQL では、WHERE
節内でインデックスの第 1
カラムを指定する場合、ほかのカラムの値を指定しなくても、クエリーが高速化できるように複合インデックスが使用されます。
次のようなテーブルが定義されているとします。
CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name) );
ここで、インデックス
name
は、last_name
と
first_name
に対するインデックスです。このインデックスは、last_name
の範囲、または
last_name
と
first_name
の両方の範囲の値を指定するクエリーに使用できます。したがって、name
インデックスは次のようなクエリーに使用されます。
SELECT * FROM test WHERE last_name='Widenius'; SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael'; SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty'); SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N';
しかし、次のクエリーには
name
インデックスが使用されません。
SELECT * FROM test WHERE first_name='Michael'; SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';
MySQL でインデックスを使用してクエリパフォーマンスを改善する方法の詳細については、項4.4.4. 「MySQL におけるインデックスの使用」を参照してください。