sql >> Database >  >> RDS >> PostgreSQL

Wat te indexeren bij zoekopdrachten met veel kolommen in de WHERE-component

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 .



  1. lijst resultaten in mysql uit dezelfde tabel

  2. MySQL-volgorde op beste match

  3. Parameter gebruiken als kolomnaam in Postgres-functie

  4. Hoe kan ik bij het samenvoegen in Oracle SQL rijen bijwerken die niet overeenkomen in de SOURCE?