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

Um índice composto com uma segunda coluna de baixa cardinalidade afetará o desempenho o suficiente para que seja usado?


O custo de manutenção de um índice (coluna única ou coluna múltipla) é quase sempre compensado pela melhoria de desempenho quando esse índice é usado. É um pequeno incremento em cada INSERT /DELETE , mais um custo se alterar o valor de um campo indexado por meio de UPDATE . (A UPDATE caso é raro.) Portanto, não se preocupe com o custo de "manter um índice composto".
WHERE `vehicles`.`type` IN ('Car')
  AND `vehicles`.`user_id` = 10

precisa de INDEX(user_id, type) .

O otimizador irá
  1. descobrir que esse índice é um possível candidato,
  2. verifique algumas estatísticas e
  3. ou use o índice ou decida que a cardinalidade é ruim e simplesmente digitalize a tabela.

Inclua o índice; não se preocupe com isso.

Eu ordenei os campos dessa maneira, não (type, user_id) com base no seu IN , o que implica que às vezes você pode ter vários valores para type .

Se todas as linhas da tabela tiverem type = 'Car' , sem problemas. Tudo o que eu disse ainda se aplica. O desperdício de incluir o desnecessário type é insignificante.

É melhor ter todas as colunas "=" primeiro em um índice, depois no máximo um outro campo. Mais discussão aqui .