Indeks może pomóc nawet w przypadku pól o niskiej kardynalności, jeśli:
-
Gdy jedna z możliwych wartości jest bardzo rzadka w porównaniu z innymi wartościami i szukasz jej.
Na przykład jest bardzo niewiele kobiet nierozróżniających kolorów, więc to zapytanie:
SELECT * FROM color_blind_people WHERE gender = 'F'najprawdopodobniej skorzystałby z indeksu
gender. -
Gdy wartości mają tendencję do grupowania w kolejności tabeli:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1Chociaż jest tylko
3tutaj odrębne lata, rekordy z wcześniejszymi latami są najprawdopodobniej dodawane jako pierwsze, więc bardzo wiele rekordów musiałoby zostać zeskanowanych przed zwróceniem pierwszego2010zapis, jeśli nie dla indeksu. -
Kiedy potrzebujesz
ORDER BY / LIMIT:SELECT * FROM people ORDER BY gender, id LIMIT 1Bez indeksu
filesortbyłoby wymagane. Chociaż jest to nieco zoptymalizowane, wykonajLIMIT, nadal wymagałoby pełnego skanowania tabeli. -
Gdy indeks obejmuje wszystkie pola użyte w zapytaniu:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3 -
Kiedy potrzebujesz
DISTINCT:SELECT DISTINCT color FROM tshirtsMySQLużyjeINDEX FOR GROUP-BY, a jeśli masz kilka kolorów, to zapytanie będzie natychmiastowe nawet przy milionach rekordów.To jest przykład scenariusza, w którym indeks w polu o niskiej liczności to więcej wydajniejsze niż na polu o wysokiej kardynalności.
Zwróć uwagę, że jeśli DML wydajność nie ma większego znaczenia, więc można bezpiecznie utworzyć indeks.
Jeśli optymalizator uzna, że indeks jest nieefektywny, indeks po prostu nie zostanie użyty.