インデックスは、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の実装のみが複数列インデックスをサポートしていて、16列まで指定することができます(この上限は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列を見つけるときだけは使用できます。)
複数列インデックスは滅多に使われるべきではありません。大体の場合において、1つの列のインデックスで十分であり、また、その方がディスク領域と時間を節約します。3つ以上の列で構成されたインデックスは不適切であると言うことができます。