sql >> Base de Datos >  >> RDS >> Mysql

¿Será suficiente un índice compuesto con una segunda columna de baja cardinalidad como para usarlo?

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

  1. descubrir que ese índice es un posible candidato,
  2. verifique algunas estadísticas, luego
  3. 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í .