8.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 ファイルを参照してください。)

問い合わせオプティマイザでは、適切な演算子が使用されている場合、 インデックスの最初の列から連続する n 個 (最大でインデックス定義で指定された列数) の列について複数列インデックスを使用することができます。 たとえば、インデックス (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 つ以上の列を使用しているインデックスは、ほぼ間違いなく不適切であると言えます。