tuning - plain index mysql
EXPLICACIÓN DE MySQL: “Uso del índice” vs. “Uso de la condición del índice” (2)
La diferencia es que "Usar índice" no necesita una búsqueda del índice a la tabla, mientras que "Usar condición de índice" a veces tiene que hacerlo. Intentaré ilustrar esto con un ejemplo. Digamos que tienes esta tabla:
id, name, location
Con un índice en
name, id
Entonces esta consulta no necesita la tabla para nada, puede recuperar toda su información "Uso del índice":
select id, name from table where name = ''Piskvor''
Pero esta consulta necesita una búsqueda de tabla para todas las filas donde el nombre es igual a ''Piskvor'', porque no puede recuperar la ubicación del índice:
select id from table where name = ''Piskvor'' and location = ''North Pole''
La consulta aún puede usar el índice para limitar los resultados a los pequeños conjuntos de filas con un nombre en particular, pero tiene que mirar esas filas en la tabla para verificar si la ubicación también coincide.
La documentación de MySQL 5.4, sobre Optimización de consultas con EXPLAIN , dice esto acerca de estos comentarios adicionales:
- Usando el índice
La información de la columna se recupera de la tabla utilizando solo la información en el árbol de índice sin tener que hacer una búsqueda adicional para leer la fila real. Esta estrategia se puede utilizar cuando la consulta solo utiliza columnas que forman parte de un único índice.
[...]
- Usando condición de índice
Las tablas se leen accediendo a las tuplas de índice y probándolas primero para determinar si leer filas completas de la tabla. De esta manera, la información del índice se utiliza para diferir ("empujar hacia abajo") la lectura de las filas de la tabla completa a menos que sea necesario.
¿Me estoy perdiendo algo, o estos dos significan lo mismo (es decir, "no leí la fila, el índice fue suficiente")?
Un ejemplo lo explica mejor:
SELECT Year, Make --- possibly more fields and/or from extra tables
FROM myUsedCarInventory
WHERE Make = ''Toyota'' AND Year > ''2006''
Assuming the Available indexes are:
CarId
VIN
Make
Make and Year
Esta consulta EXPLIARÍA con ''Uso del índice'' porque no necesita, en absoluto , "golpear" la propia tabla myUsedCarInventory ya que el índice "Marca y año" cubre "su necesidad con respecto a los elementos de la cláusula WHERE que Pertenecen a esa mesa .
Ahora, imagínese, mantenemos la consulta igual, pero para la adición de una condición en el color
...
WHERE Make = ''Toyota'' AND Year > ''2006'' AND Color = ''Red''
Esta consulta probablemente EXPLIARÁ con ''Uso de la Condición de Índice'' (el ''probable'', aquí en el caso de que Toyota + año no se estimara que fuera lo suficientemente selectivo, y el optimizador puede decidir simplemente escanear la tabla). Esto significaría que MySQL PRIMERO usaría el índice para resolver Make + Year, y también tendría que buscar la fila correspondiente en la tabla, solo para las filas que cumplen con las condiciones de Make + Year. Eso es lo que a veces se denomina " optimización de empuje hacia abajo ".