Jednosloupcový index
Postgres dokáže velmi efektivně kombinovat více indexů v jediném dotazu s skenováním bitmapových indexů . Většinou se vybere nejselektivnější index (nebo dva v kombinaci s prohledáváním indexu bitmap) a zbytek se filtruje. Jakmile je sada výsledků dostatečně úzká, není efektivní skenovat více indexů.
Vícesloupcový index
Stále je rychlejší mít dokonale odpovídající vícesloupcový index, ale ne o řády.
Protože chcete zahrnout typ pole Doporučuji použít GIN index. AFAIK, třídy operátorů chybí pro obecné indexy GiST na typu pole. (Výjimkou je intarray
pro integer
pole.)
Chcete-li zahrnout integer
nejprve nainstalujte přídavný modul btree_gin
, který poskytuje potřebné třídy operátorů GIN. Spustit jednou pro každou databázi :
CREATE EXTENSION btree_gin;
Pak byste měli být schopni vytvořit svůj vícesloupcový index:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
Pořadí sloupců indexu je pro indexy GIN irelevantní. Manuál:
Vícesloupcový index GIN lze použít s podmínkami dotazu, které zahrnují jakoukoli podmnožinu sloupců indexu. Na rozdíl od B-stromu nebo GiST je účinnost vyhledávání indexu stejná bez ohledu na to, který sloupec indexu(y) používají podmínky dotazu.
Hledání nejbližšího souseda
Protože zahrnujete geometry
PostGis typu, je pravděpodobné, že chcete provést vyhledávání nejbližšího souseda, ke kterému potřebujete GiST index. V tomto případě navrhuji dva indexy:
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);
Můžete přidat integer
sloupec c
k jednomu nebo oběma. To záleží. K tomu potřebujete buď btree_gin
nebo btree_gist
nebo obojí.