Un index peut être utile même sur des champs à faible cardinalité si :
-
Lorsqu'une des valeurs possibles est très peu fréquente par rapport aux autres valeurs et que vous la recherchez.
Par exemple, il y a très peu de femmes daltoniennes, donc cette requête :
SELECT * FROM color_blind_people WHERE gender = 'F'
bénéficierait très probablement d'un index sur le
gender
. -
Lorsque les valeurs ont tendance à être regroupées dans l'ordre du tableau :
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
Bien qu'il n'y ait que
3
des années distinctes ici, les enregistrements avec des années antérieures sont très probablement ajoutés en premier, de sorte que de très nombreux enregistrements devraient être scannés avant de renvoyer le premier2010
enregistrer sinon pour l'index. -
Lorsque vous avez besoin de
ORDER BY / LIMIT
:SELECT * FROM people ORDER BY gender, id LIMIT 1
Sans l'index, un
filesort
serait nécessaire. Bien qu'il soit quelque peu optimisé, faites pour leLIMIT
, il faudrait quand même une analyse complète de la table. -
Lorsque l'index couvre tous les champs utilisés dans la requête :
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
Quand vous avez besoin de
DISTINCT
:SELECT DISTINCT color FROM tshirts
MySQL
utiliseraINDEX FOR GROUP-BY
, et si vous avez peu de couleurs, cette requête sera instantanée même avec des millions d'enregistrements.Ceci est un exemple de scénario où l'index sur un champ à faible cardinalité est plus efficace que sur un champ de cardinalité élevée.
Notez que si DML
les performances ne sont pas très importantes sur un problème, alors vous pouvez créer l'index en toute sécurité.
Si l'optimiseur pense que l'index est inefficace, l'index ne sera tout simplement pas utilisé.