El costo de mantener un índice (de una sola columna o de varias columnas) casi siempre se compensa con la mejora del rendimiento cuando se usa ese índice. Es un pequeño incremento en cada INSERT
/DELETE
, más un costo si cambia el valor de un campo indexado a través de UPDATE
. (El UPDATE
caso es raro). Por lo tanto, no se preocupe por el costo de "mantener un índice compuesto".
WHERE `vehicles`.`type` IN ('Car')
AND `vehicles`.`user_id` = 10
necesita INDEX(user_id, type)
.
El optimizador
- descubrir que ese índice es un posible candidato,
- verifique algunas estadísticas, luego
- usar el índice o decidir que la cardinalidad es mala y simplemente escanear la tabla.
Incluir el índice; no te preocupes por eso.
Ordené los campos de esa manera, no (type, user_id)
basado en su IN
, lo que implica que a veces puede tener varios valores para type
.
Si todas las filas de la tabla tienen type = 'Car'
, ningún problema. Todo lo que he dicho sigue siendo válido. El desperdicio de incluir el type
innecesario es insignificante.
Es mejor tener todas las columnas "=" primero en un índice y luego, como máximo, otro campo. Más discusión aquí .