sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvad skal indekseres på forespørgsler med masser af kolonner i WHERE-sætningen

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 .



  1. Hvilken type er denne streng? a:1:{s:2:da;}

  2. XMLType i oracle genererer ikke tags for kolonner med Null-værdier

  3. Er der nogen logisk grund til at have forskellig tablespace til indekser?

  4. Hvordan kan jeg forhindre/detektere et underløb i en Postgresql-beregning, der bruger EXP()