Ein Index kann auch bei Feldern mit niedriger Kardinalität hilfreich sein, wenn:
-
Wenn einer der möglichen Werte im Vergleich zu den anderen Werten sehr selten vorkommt und Sie danach suchen.
Zum Beispiel gibt es sehr wenige farbenblinde Frauen, also diese Abfrage:
SELECT * FROM color_blind_people WHERE gender = 'F'
würde höchstwahrscheinlich von einem Index zu
gender
profitieren . -
Wenn die Werte in der Regel in der Tabellenreihenfolge gruppiert sind:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
Obwohl es nur
3
sind Hier werden Datensätze mit früheren Jahren höchstwahrscheinlich zuerst hinzugefügt, so dass sehr viele Datensätze gescannt werden müssten, bevor der erste2010
zurückgegeben wird Rekord wenn nicht für den Index. -
Wenn Sie
ORDER BY / LIMIT
benötigen :SELECT * FROM people ORDER BY gender, id LIMIT 1
Ohne den Index ein
filesort
erforderlich wäre. Obwohl es etwas optimiert ist, tun Sie dasLIMIT
, es wäre immer noch ein vollständiger Tabellenscan erforderlich. -
Wenn der Index alle in der Abfrage verwendeten Felder abdeckt:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
Wenn Sie
DISTINCT
benötigen :SELECT DISTINCT color FROM tshirts
MySQL
verwendetINDEX FOR GROUP-BY
, und wenn Sie nur wenige Farben haben, wird diese Abfrage auch bei Millionen von Datensätzen sofort ausgeführt.Dies ist ein Beispiel für ein Szenario, in dem der Index für ein Feld mit niedriger Kardinalität mehr ist effizienter als auf einem Feld mit hoher Kardinalität.
Beachten Sie, dass wenn DML
Leistung ist nicht viel auf ein Problem, dann ist es sicher, den Index zu erstellen.
Wenn der Optimierer denkt, dass der Index ineffizient ist, wird der Index einfach nicht verwendet.