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 1
Chociaż jest tylko
3
tutaj 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 pierwszego2010
zapis, jeśli nie dla indeksu. -
Kiedy potrzebujesz
ORDER BY / LIMIT
:SELECT * FROM people ORDER BY gender, id LIMIT 1
Bez indeksu
filesort
był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 tshirts
MySQL
uż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.