Mysql
 sql >> Database >  >> RDS >> Mysql

Copertura MySQL rispetto a indice composito e colonna

Un indice di copertura non è la stessa cosa di un indice composito.

Se ho 2 indici separati uno su col3 e l'altro su col4, quale di essi verrà utilizzato in questa query?

L'indice con la cardinalità più alta.
MySQL conserva le statistiche su quale indice ha quali proprietà.
Verrà utilizzato l'indice che ha il potere più discriminante (come evidente nelle statistiche di MySQL).

Ho letto da qualche parte che per ogni tabella nella query viene utilizzato un solo indice. Significa che non c'è modo per la query di utilizzare entrambi gli indici?

Puoi utilizzare una sottoselezione.
O ancora meglio utilizzare un indice composto che includa sia col3 che col4.

In secondo luogo, se ho creato un indice composito usando sia col3 che col4 insieme ma ho usato solo col3 nella clausola WHERE, sarebbe peggio per le prestazioni? esempio:

Indice composto
Il termine corretto è compound indice, non composto.
Solo il più a sinistra verrà utilizzata parte dell'indice composto.
Quindi se l'indice è definito come

index myindex (col3, col4)  <<-- will work with your example.
index myindex (col4, col3)  <<-- will not work. 

Vedere:http://dev.mysql.com /doc/refman/5.0/en/indici-a-colonna-multipla.html

Tieni presente che se selezioni un campo all'estrema sinistra, puoi evitare di utilizzare quella parte dell'indice nella tua clausola where.
Immagina di avere un indice composto

Myindex(col1,col2)

SELECT col1 FROM table1 WHERE col2 = 200  <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200     <<-- will NOT use index.  

Il motivo per cui funziona è che la prima query utilizza l'indice di copertura ed esegue una scansione su quello.
La seconda query deve accedere alla tabella e per questo motivo la scansione dell'indice non ha senso.
Questo funziona solo in InnoDB.

Cos'è un indice di copertura
Un indice di copertura si riferisce al caso in cui tutti i campi selezionati in una query sono covered da un indice, in tal caso InnoDB (non MyISAM) non leggerà mai i dati nella tabella, ma utilizzerà solo i dati nell'indice, velocizzando notevolmente la selezione.
Si noti che in InnoDB la chiave primaria è inclusa in tutti gli indici secondari, quindi in un certo senso tutti gli indici secondari sono indici composti.
Ciò significa che se esegui la seguente query su InnoDB:

SELECT indexed_field FROM table1 WHERE pk = something

MySQL utilizzerà sempre un indice di copertura e non accederà alla tabella effettiva. Sebbene possa utilizzare un indice di copertura, preferirà la PRIMARY KEY perché deve colpire solo una singola riga.