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 1
Anche se ci sono solo
3
anni distinti qui, i record con anni precedenti molto probabilmente vengono aggiunti per primi, quindi moltissimi record dovrebbero essere scansionati prima di restituire il primo2010
registra se non per l'indice. -
Quando hai bisogno di
ORDER BY / LIMIT
:SELECT * FROM people ORDER BY gender, id LIMIT 1
Senza l'indice, un
filesort
sarebbe 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 tshirts
MySQL
utilizzeràINDEX FOR GROUP-BY
e 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.