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

Cosa indicizzare su query con molte colonne nella clausola WHERE

Devi capire cosa WHERE clausole che utilizzerai con questa query, con quale frequenza si verificheranno e quanto sarà selettiva ciascuna condizione.

  • Non indicizzare le query che si verificano di rado a meno che non sia necessario.

  • Usa indici multicolonna, a partire da quelle colonne che si troveranno in un = confronto.

  • Per quanto riguarda l'ordine delle colonne in un indice multicolonna, iniziare con quelle colonne che verranno utilizzate in una query da sole (un indice può essere utilizzato per una query con solo alcune delle sue colonne, a condizione che si trovino all'inizio dell'indice).

  • Potresti omettere colonne con bassa selettività, come gender .

Ad esempio, con le query precedenti, se sono tutte frequenti e tutte le colonne sono selettive, questi indici sarebbero utili:

... ON apartments (city_id, rooms, size)

... ON apartments (area_id, ad_type, price)

... ON apartments (area_id, ad_type, published_at)

Questi indici possono essere usati anche per WHERE clausole con solo area_id o city_id in essi.

È brutto avere troppi indici.

Se il metodo sopra porta a troppi indici, ad es. perché l'utente può scegliere colonne arbitrarie per WHERE clausola, è meglio indicizzare singole colonne o occasionalmente coppie di colonne che vanno regolarmente insieme.

In questo modo PostgreSQL può scegliere una scansione dell'indice bitmap per combinare più indici per una query. È meno efficiente di una normale scansione dell'indice , ma di solito meglio di una scansione sequenziale .