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
genderprofitieren . -
Wenn die Werte in der Regel in der Tabellenreihenfolge gruppiert sind:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1Obwohl es nur
3sind 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 erste2010zurückgegeben wird Rekord wenn nicht für den Index. -
Wenn Sie
ORDER BY / LIMITbenötigen :SELECT * FROM people ORDER BY gender, id LIMIT 1Ohne den Index ein
filesorterforderlich 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
DISTINCTbenötigen :SELECT DISTINCT color FROM tshirtsMySQLverwendetINDEX 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.