Un indice può aiutare anche su campi a cardinalità bassa se:
-
Quando uno dei valori possibili è molto raro rispetto agli altri valori e lo cerchi.
Ad esempio, ci sono pochissime donne daltoniche, quindi questa query:
SELECT * FROM color_blind_people WHERE gender = 'F'molto probabilmente trarrebbero vantaggio da un indice su
gender. -
Quando i valori tendono ad essere raggruppati nell'ordine della tabella:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1Anche se ci sono solo
3anni distinti qui, i record con anni precedenti molto probabilmente vengono aggiunti per primi, quindi moltissimi record dovrebbero essere scansionati prima di restituire il primo2010registra se non per l'indice. -
Quando hai bisogno di
ORDER BY / LIMIT:SELECT * FROM people ORDER BY gender, id LIMIT 1Senza l'indice, un
filesortsarebbe richiesto. Sebbene sia in qualche modo ottimizzato, fai ilLIMIT, sarebbe comunque necessaria una scansione completa della tabella. -
Quando l'indice copre tutti i campi utilizzati nella query:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3 -
Quando hai bisogno di
DISTINCT:SELECT DISTINCT color FROM tshirtsMySQLutilizzeràINDEX FOR GROUP-BYe se hai pochi colori, questa query sarà istantanea anche con milioni di record.Questo è un esempio di uno scenario in cui l'indice su un campo a cardinalità bassa è più efficiente di quello su un campo ad alta cardinalità.
Nota che se DML le prestazioni non sono molto importanti, quindi è possibile creare l'indice.
Se l'ottimizzatore ritiene che l'indice sia inefficiente, l'indice semplicemente non verrà utilizzato.