Ett index kan hjälpa även på fält med låg kardinalitet om:
-
När ett av möjliga värden är mycket sällsynt jämfört med de andra värdena och du söker efter det.
Till exempel finns det väldigt få färgblinda kvinnor, så den här frågan:
SELECT * FROM color_blind_people WHERE gender = 'F'
skulle med största sannolikhet dra nytta av ett index på
gender
. -
När värdena tenderar att grupperas i tabellordning:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
Även om det bara finns
3
distinkta år här, poster med tidigare år läggs troligen till först så väldigt många poster skulle behöva skannas innan den första2010
returneras spela in om inte för indexet. -
När du behöver
ORDER BY / LIMIT
:SELECT * FROM people ORDER BY gender, id LIMIT 1
Utan index, en
filesort
skulle krävas. Även om det är något optimerat förLIMIT
, det skulle fortfarande behöva en fullständig tabellskanning. -
När indexet täcker alla fält som används i frågan:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
När du behöver
DISTINCT
:SELECT DISTINCT color FROM tshirts
MySQL
kommer att användaINDEX FOR GROUP-BY
, och om du har få färger kommer denna fråga att vara omedelbar även med miljontals poster.Detta är ett exempel på ett scenario när indexet på ett fält med låg kardinalitet är mer effektivare än så på ett fält med hög kardinalitet.
Observera att om DML
prestanda är inte mycket på ett problem, då är det säkert att skapa indexet.
Om optimeraren anser att indexet är ineffektivt, kommer indexet helt enkelt inte att användas.