Je moet uitzoeken wat WHERE
clausules die u bij deze zoekopdracht gaat gebruiken, hoe vaak elke voorwaarde zal voorkomen en hoe selectief elke voorwaarde zal zijn.
-
Indexeer niet voor zoekopdrachten die zelden voorkomen, tenzij het moet.
-
Gebruik indexen met meerdere kolommen, te beginnen met de kolommen die zullen voorkomen in een
=
vergelijking. -
Wat betreft de volgorde van kolommen in een index met meerdere kolommen, begin met die kolommen die op zichzelf in een zoekopdracht worden gebruikt (een index kan worden gebruikt voor een zoekopdracht met slechts enkele van zijn kolommen, op voorwaarde dat ze aan het begin van de index staan).
-
U kunt kolommen met een lage selectiviteit weglaten, zoals
gender
.
Bijvoorbeeld, met uw bovenstaande zoekopdrachten, als ze allemaal frequent zijn en alle kolommen selectief zijn, zouden deze indexen goed zijn:
... ON apartments (city_id, rooms, size)
... ON apartments (area_id, ad_type, price)
... ON apartments (area_id, ad_type, published_at)
Deze indexen kunnen ook worden gebruikt voor WHERE
clausules met alleen area_id
of city_id
erin.
Het is slecht om te veel indexen te hebben.
Als bovenstaande methode tot te veel indexen zou leiden, b.v. omdat de gebruiker willekeurige kolommen kan kiezen voor de WHERE
clausule, is het beter om afzonderlijke kolommen te indexeren of soms paren kolommen die regelmatig samengaan.
Op die manier kan PostgreSQL een bitmapindexscan kiezen om meerdere indexen voor één zoekopdracht te combineren. Dat is minder efficiënt dan een gewone indexscan , maar meestal beter dan een sequentiële scan .