Um índice pode ajudar mesmo em campos de baixa cardinalidade se:
-
Quando um dos valores possíveis é muito infrequente comparado aos outros valores e você o procura.
Por exemplo, há muito poucas mulheres daltônicas, então esta consulta:
SELECT * FROM color_blind_people WHERE gender = 'F'
provavelmente se beneficiaria de um índice degender
.
-
Quando os valores tendem a ser agrupados na ordem da tabela:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
Embora existam apenas3
anos distintos aqui, os registros com anos anteriores são provavelmente adicionados primeiro, então muitos registros teriam que ser digitalizados antes de retornar o primeiro2010
registro se não for para o índice.
-
Quando você precisa deORDER BY / LIMIT
:
SELECT * FROM people ORDER BY gender, id LIMIT 1
Sem o índice, umfilesort
seria necessário. Embora seja um pouco otimizado, faça para oLIMIT
, ele ainda precisaria de uma verificação completa da tabela.
-
Quando o índice abrange todos os campos usados na consulta:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
Quando você precisa deDISTINCT
:
SELECT DISTINCT color FROM tshirts
MySQL
usaráINDEX FOR GROUP-BY
, e se você tiver poucas cores, essa consulta será instantânea mesmo com milhões de registros.
Este é um exemplo de cenário em que o índice em um campo de baixa cardinalidade é mais eficiente do que em um campo de alta cardinalidade.
Observe que se
DML
desempenho não é muito importante, então é seguro criar o índice. Se o otimizador achar que o índice é ineficiente, o índice simplesmente não será usado.