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 .