Du skal finde ud af hvad WHERE
klausuler, du vil bruge med denne forespørgsel, hvor ofte hver vil forekomme, og hvor selektiv hver betingelse vil være.
-
Indekser ikke for forespørgsler, der forekommer sjældent, medmindre du er nødt til det.
-
Brug indekser med flere kolonner, startende med de kolonner, der vil forekomme i en
=
sammenligning. -
Med hensyn til rækkefølgen af kolonner i et indeks med flere kolonner, start med de kolonner, der vil blive brugt i en forespørgsel alene (et indeks kan bruges til en forespørgsel med kun nogle af dens kolonner, forudsat at de er i begyndelsen af indekset).
-
Du kan udelade kolonner med lav selektivitet, såsom
gender
.
For eksempel, med dine ovenstående forespørgsler, hvis de alle er hyppige, og alle kolonner er selektive, ville disse indekser være gode:
... ON apartments (city_id, rooms, size)
... ON apartments (area_id, ad_type, price)
... ON apartments (area_id, ad_type, published_at)
Disse indekser kan også bruges til WHERE
klausuler med kun area_id
eller city_id
i dem.
Det er dårligt at have for mange indekser.
Hvis ovenstående metode ville føre til for mange indekser, f.eks. fordi brugeren kan vælge vilkårlige kolonner til WHERE
klausul, er det bedre at indeksere individuelle kolonner eller lejlighedsvis par af kolonner, der regelmæssigt går sammen.
På den måde kan PostgreSQL vælge en bitmap-indeksscanning at kombinere flere indekser for én forespørgsel. Det er mindre effektivt end en almindelig indeksscanning , men normalt bedre end en sekventiel scanning .