2009-12-03 18 views
15

Solo una domanda semplice, ma l'ordine del tuo indice è importante quando si estende su più colonne?Ordine dell'indice su più colonne

Ad esempio, prendendo la query:

 
SELECT * FROM my_table WHERE (column_1 = 1 AND column_2 = 2) 

Se voglio aggiungere un indice per una query come questo, cosa importa se il mio indice viene creato in questo modo:

 
CREATE INDEX my_index 
ON my_table (column_1, column_2) 

Or così:

 
CREATE INDEX my_index 
ON my_table (column_2, column_1) 

Grazie per l'aiuto!

risposta

21

Nell'esempio fornito, l'ordine delle colonne non ha importanza.

Sarebbe importante se ordinate su una colonna; un indice su (col1,col2) può essere utilizzato per ORDER BY col1, col2 ma non per ORDER BY col2, col1.

Per le clausole WHERE, un indice su (col1, col2) funziona per WHERE col1 = 1 AND col2 = 1. Funziona anche per WHERE col1 = 1. Ma non può aiutare con WHERE col2 = 1.

+4

In realtà può essere importante anche in questo caso. Se quasi ogni riga ha col1 = 1, l'indice molto probabilmente funzionerà meglio se col2 fosse il primo, anche se stai interrogando entrambi. –

+3

Potrebbe importare anche nell'esempio fornito, se una colonna presenta un'elicività significativamente più alta dell'altra. Metti le colonne con alta selettività (molti valori diversi) prima. – Manu

+0

Ottima informazione in questa risposta per capire come colpire gli indici già disponibili su un sistema. – Swoop

0

Il modo migliore per scoprirlo è misurarlo. Provane una, misura le prestazioni, quindi rimuovi l'indice e prova l'altro. In genere si desidera che i dati vengano interrogati insieme per trovarsi vicini nell'indice sul disco e l'ordine delle colonne nell'indice fa la differenza rispetto al modo in cui l'indice è memorizzato su disco. È molto difficile indovinare esattamente quale combinazione di indici funzionerà meglio, quindi prova alcune possibilità e misure diverse per scoprire quale è la migliore per i tuoi dati.