インデックスは、1 つ以上の列に定義することができます。 たとえば、以下のようなテーブルがあるとします。
CREATE TABLE test2 ( major int, minor int, name varchar );
(たとえば、/dev ディレクトリの内容をデータベースに保持していて) 頻繁に下記のような問い合わせを実行するとします。
SELECT name FROM test2 WHERE major = constant AND minor = constant;
このような場合、major および minor という 2 つの列に 1 つのインデックスを定義する方が適切かもしれません。
CREATE INDEX test2_mm_idx ON test2 (major, minor);
現在、B-tree および GiST の実装でのみ、複数列インデックスをサポートしています。 最高 32 列まで指定可能です。 (この上限は、PostgreSQL を構築する際に変更可能です。pg_config.h ファイルを参照してください。)
問い合わせオプティマイザでは、適切な演算子が使用されている場合、 インデックスの最初の列から連続する n 個 (最大でインデックス定義で指定された列数) の列について複数列インデックスを使用することができます。 たとえば、インデックス (a, b, c) は、a、b、および c のすべてを使用する問い合わせ、もしくは a および b 両方を使用する問い合わせ、もしくは a のみを使用する問い合わせで使用可能ですが、それ以外の組み合わせでは使用できません。 (a および c を使用した問い合わせでは、オプティマイザは、a にのみインデックスを使用し、c は通常のインデックスがついていない列のように扱うでしょう。)
複数列インデックスは、インデックスのついた列を含む句が AND で結合されている場合にのみ、使用することができます。 たとえば、
SELECT name FROM test2 WHERE major = constant OR minor = constant;
この問い合わせでは、上記で定義されたインデックス test2_mm_idx を使用して、両列を検索することはできません。 (ただし、major 列のみであれば、上記のインデックスを使用して検索できます。)
複数列インデックスは、慎重に使用する必要があります。 多くの場合、単一列のインデックスで十分であり、また、その方がディスク領域と時間を節約できます。 3 つ以上の列を使用しているインデックスは、ほぼ間違いなく不適切であると言えます。