11.3. 複数列インデックス

インデックスは、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ファイルを参照してください。)

問い合わせプランナでは、インデックス定義の最初の列から連続する任意数の右方向の列を含む問い合わせに対して複数列インデックスを使用することができます。 たとえば、(a, b, c)上のインデックスは、ab、およびcのすべてを含む問い合わせ、もしくはaおよびb両方を含む問い合わせ、もしくはaのみを使用する問い合わせで使用可能ですが、それ以外の組み合わせでは使用できません。 (aおよびcを含む問い合わせでは、プランナは、aにのみインデックスを使用し、cは通常のインデックスがついていない列のように扱うでしょう。) もちろん、各列はインデックスの種類に適した演算子を使用している必要があります。 他の演算子を持つ句では考慮されません。

複数列インデックスは、インデックスのついた列を含む句がANDで結合されている場合にのみ、使用することができます。 たとえば、

SELECT name FROM test2 WHERE major = constant OR minor = constant;

この問い合わせでは、上記で定義されたインデックスtest2_mm_idxを使用して、両列を検索することはできません。 (ただし、major列のみであれば、上記のインデックスを使用して検索できます。)

複数列インデックスは、慎重に使用する必要があります。 多くの場合、単一列のインデックスで十分であり、また、その方がディスク領域と時間を節約できます。 テーブルの使用方法が極端に様式化されていない限り、3つ以上の列を使用しているインデックスは、ほぼ間違いなく不適切であると言えます。