7.3. マルチカラムインデックス

インデックスは一つ以上のカラムで定義されることができます。 例えば、このようなテーブルがあったとします。

CREATE TABLE test2 (
  major int,
  minor int,
  name varchar
);
(/devディレクトリをデータベースに 持っているとしましょう)そして頻繁に下記のような問い合わせをします。
SELECT name FROM test2 WHERE major = constant AND minor = constant;
そうすると、インデックスをカラム majorminorの両方上で定義するのが相応しいかもしれま せん。
CREATE INDEX test2_mm_idx ON test2 (major, minor);

現在では、B-tree の実装だけがマルチカラムインデックスをサポートしています。 16 カラムまで指定することができます。(この上限はPostgres を構築するときに変えることができます。ファイル config.hを参照してください。)

問い合わせオプティマイザは、インデックスに最初の連続した nカラム(相応しい演算子と使われている時)から インデックス定義で指定されたカラムの総数までを含む問い合わせに、 マルチカラムインデックスを使うことができます。例えば、 (a, b, c)のインデックスはabcの全てを使う問い合わせ、 もしくはab両方を を使う問い合わせ、またはaのみを使う問い合わせ の中で使われることができますが、それ以外の組み合せでは使えません。 (acを使った問い合わせ では、オプティマイザはaにのみインデックス を使うことにし、cは通常のインデックスなしの カラムのように扱うかもしれません。)

マルチカラムインデックスは、インデックスのついたカラムがAND で結合されている場合にのみ使うことができます。例えば下記は、

SELECT name FROM test2 WHERE major = constant OR minor = constant;
両方のカラムを見つけるために上で定義された test2_mm_idxを利用することができません。 (しかしmajor カラムを見つける時だけは使うことが できます。)

マルチカラムインデックスは滅多に使われるべきではありません。大体の 場合において、一つのカラムのインデックスは十分でありディスク領域と時間を 節約します。3 つ以上のインデックスを持つカラムはほぼ 不適切であると断言できます。