単一列インデックス
Postgresは、ビットマップインデックススキャンを使用して、1つのクエリで複数のインデックスを非常に効率的に組み合わせることができます。 。ほとんどの場合、最も選択的なインデックスが選択され(または、ビットマップインデックススキャンと組み合わせて2つ)、残りはフィルタリングされます。結果セットが十分に狭くなると、それ以上のインデックスをスキャンするのは効率的ではありません。
複数列のインデックス
完全に一致する複数列のインデックスを作成する方がさらに高速ですが、桁違いではありません。
配列型を含める必要があるため GINを使用することをお勧めします 索引。 AFAIK、配列型の汎用GiSTインデックスの演算子クラスがありません。 (例外はintarray
integer
の場合 配列。)
integer
を含めるには 列、最初に追加モジュール btree_gin
をインストールします 、必要なGIN演算子クラスを提供します。 データベースごとに1回実行 :
CREATE EXTENSION btree_gin;
次に、複数列のインデックスを作成できるようになります。
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
インデックス列の順序は、GINインデックスには関係ありません。マニュアル:
複数列のGINインデックスは、インデックスの列の任意のサブセットを含むクエリ条件で使用できます。 BツリーやGiSTとは異なり、インデックス検索の有効性は、クエリ条件が使用するインデックス列に関係なく同じです。
最近傍検索
PostGisのgeometry
を含めているので タイプ、チャンスはあなたが GiSTを必要とする最も近い隣人検索をしたいです 索引。この場合、2つをお勧めします インデックス:
CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c); -- geometry type
CREATE INDEX tbl_bc_gin_idx ON tbl USING GIN(b, c);
integer
を追加できます 列c
どちらかまたは両方に。そのためには、 btree_gin
のいずれかが必要です。 またはbtree_gist
それぞれ、または両方。