Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Faz sentido usar um índice que terá uma baixa cardinalidade?


Um índice pode ajudar mesmo em campos de baixa cardinalidade se:

  1. 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 de gender .

  2. Quando os valores tendem a ser agrupados na ordem da tabela:
    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    Embora existam apenas 3 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 primeiro 2010 registro se não for para o índice.

  3. Quando você precisa de ORDER BY / LIMIT :
    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    Sem o índice, um filesort seria necessário. Embora seja um pouco otimizado, faça para o LIMIT , ele ainda precisaria de uma verificação completa da tabela.

  4. 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
    

  5. Quando você precisa de DISTINCT :
    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.