Enkeltkolonneindeks
Postgres kan kombinere flere indekser meget effektivt i en enkelt forespørgsel med bitmap-indeksscanninger . Det meste af tiden vælges det mest selektive indeks (eller to, kombineret med bitmap-indeksscanninger), og resten filtreres. Når først resultatsættet er smalt nok, er det ikke effektivt at scanne flere indekser.
Flerkolonneindeks
Det er stadig hurtigere at have et perfekt matchende indeks med flere kolonner, men ikke efter størrelsesordener.
Da du vil inkludere en arraytype Jeg foreslår at bruge en GIN indeks. AFAIK, operatørklasser mangler for generelle GiST-indekser på array-type. (Undtagelsen er intarray
for integer
arrays.)
At inkludere integer
kolonne, skal du først installere det ekstra modul btree_gin
, som giver de nødvendige GIN-operatørklasser. Kør én gang pr. database :
CREATE EXTENSION btree_gin;
Så skulle du være i stand til at oprette dit multikolonneindeks:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
Rækkefølgen af indekskolonner er irrelevant for GIN-indekser. Manualen:
Et multikolonne GIN-indeks kan bruges med forespørgselsbetingelser, der involverer et hvilket som helst undersæt af indeksets kolonner. I modsætning til B-tree eller GiST er indekssøgeeffektiviteten den samme, uanset hvilke indekskolonne(r) forespørgselsbetingelserne bruger.
Søg efter nærmeste nabo
Da du inkluderer en PostGis geometry
type, sandsynligvis vil du lave en nærmeste nabosøgning, som du skal bruge en GiST til indeks. I dette tilfælde foreslår jeg to indekser:
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);
Du kan tilføje integer
kolonne c
til den ene eller begge. Det afhænger af. Til det skal du enten bruge btree_gin
eller btree_gist
eller begge dele.