Een index kan zelfs helpen bij velden met een lage kardinaliteit als:
-
Wanneer een van de mogelijke waarden zeer zeldzaam is in vergelijking met de andere waarden en u zoekt ernaar.
Er zijn bijvoorbeeld maar heel weinig kleurenblinde vrouwen, dus deze vraag:
SELECT * FROM color_blind_people WHERE gender = 'F'
zou hoogstwaarschijnlijk baat hebben bij een index op
gender
. -
Wanneer de waarden de neiging hebben om in de tabelvolgorde te worden gegroepeerd:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
Hoewel er maar
3
. zijn verschillende jaren hier, records met eerdere jaren worden hoogstwaarschijnlijk eerst toegevoegd, dus heel veel records zouden moeten worden gescand voordat de eerste2010
wordt geretourneerd opnemen indien niet voor de index. -
Wanneer u
ORDER BY / LIMIT
nodig heeft :SELECT * FROM people ORDER BY gender, id LIMIT 1
Zonder de index, een
filesort
vereist zou zijn. Hoewel het enigszins geoptimaliseerd is voor deLIMIT
, zou het nog steeds een volledige tafelscan nodig hebben. -
Wanneer de index alle velden bedekt die in de zoekopdracht worden gebruikt:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
Wanneer u
DISTINCT
nodig heeft :SELECT DISTINCT color FROM tshirts
MySQL
gebruiktINDEX FOR GROUP-BY
, en als u weinig kleuren heeft, is deze zoekopdracht direct beschikbaar, zelfs bij miljoenen records.Dit is een voorbeeld van een scenario waarin de index op een veld met een lage kardinaliteit meer is efficiënter dan dat op een veld met hoge kardinaliteit.
Merk op dat als DML
prestatie is niet zo belangrijk, dan is het veilig om de index te maken.
Als de optimizer denkt dat de index inefficiënt is, wordt de index gewoon niet gebruikt.