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

MySQL:colonne a bassa cardinalità/selettività =come indicizzare?

L'indice che descrivi è praticamente inutile. È meglio utilizzare un indice quando devi selezionare un valore piccolo numero di righe rispetto al totale delle righe.

La ragione di ciò è correlata al modo in cui un database accede a una tabella. Le tabelle possono essere valutate tramite una scansione completa della tabella, in cui ogni blocco viene letto ed elaborato a turno. Oppure tramite una ricerca rowid o chiave, in cui il database ha una chiave/rowid e legge la riga esatta richiesta.

Nel caso in cui utilizzi una clausola where basata sulla chiave primaria o su un altro indice univoco, ad es. where id = 1 , il database può utilizzare l'indice per ottenere un riferimento esatto a dove sono archiviati i dati della riga. Questo è chiaramente più efficiente che eseguire una scansione completa della tabella ed elaborare ogni blocco.

Ora tornando al tuo esempio, hai una clausola where di where status = 'enabled' , l'indice restituirà 150 milioni di righe e il database dovrà leggere ogni riga a turno utilizzando letture separate. Considerando che l'accesso alla tabella con una scansione completa della tabella consente al database di utilizzare letture più grandi e più efficienti.

C'è un punto in cui è meglio eseguire solo una scansione completa della tabella piuttosto che utilizzare l'indice. Con mysql puoi usare FORCE INDEX (idx_name) come parte della tua query per consentire confronti tra ciascun metodo di accesso alla tabella.

Riferimento:http://dev .mysql.com/doc/refman/5.5/en/how-to-evitare-table-scan.html