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á
- descobrir que esse índice é um possível candidato,
- verifique algumas estatísticas e
- 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 .