2009-11-06 10 views
26

El MySQL 5.4 documentation, on Optimizing Queries with EXPLAIN, dice esto acerca de estas observaciones adicionales:MySQL explico: "Uso de índice" frente a "El uso de la condición de índice"

  • mediante el índice de

La información de la columna se recupera de la tabla que usa solo información en el árbol de índice sin tener que hacer una búsqueda adicional para leer la fila real . Esta estrategia se puede usar cuando la consulta utiliza solo columnas que son parte de un único índice.

[...]

  • Usando condición índice

Tablas se leen accediendo índice tuplas y probándolos primero en determinar si se debe leer mesa llena filas. De esta forma, la información del índice se usa para diferir ("empujar hacia abajo") al leer filas completas de tablas a menos que sea necesario.

Me falta algo, o estos dos significan lo mismo (es decir, "no leí la fila, el índice era suficiente")?

Respuesta

56

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 explicaría con 'Uso de índice', ya que no necesita, en absoluto , "golpear" la mesa myUsedCarInventory en sí ya que el "Hacer y Año "índice" cubrir "su necesidad con respecto a los elementos de la cláusula WHERE que pertenecen a esa tabla.

Ahora, imaginemos, mantenemos la consulta del mismo, sino por la adición de una condición sobre el color

... 
WHERE Make = 'Toyota' AND Year > '2006' AND Color = 'Red' 

Esta consulta probabilidades de explicar con 'Usando Índice de Condición' (la 'probabilidad', aquí es el caso de que Toyota + año no se estimaría ser lo suficientemente selectivo, y el optimizador puede decidir escanear la tabla). Esto significaría que MySQL podría FIRST usar el índice para resolver el Make + Year, y también debería buscar la fila correspondiente en la tabla, solo para las filas que satisfacen las condiciones Make + Year. Eso es lo que a veces se denomina "push down optimization".

+0

+1 Buena explicación – Andomar

+0

¿Estoy en lo cierto al suponer que también vería "Usar dónde" en su segundo ejemplo? – Piskvor

+0

@Piskvor Lo siento, no estoy en condiciones de probar esto, por el momento, ambas consultas se mostrarían como "Uso de dónde", creo. – mjv

6

La diferencia es que "Usar índice" no necesita una búsqueda desde el índice a la tabla, mientras que "Usar condición de índice" a veces tiene que hacerlo. Trataré de ilustrar esto con un ejemplo. Digamos que tiene esta tabla:

id, name, location 

Con un índice en

name, id 

A continuación, esta consulta no necesita la mesa para cualquier cosa, se puede recuperar toda su información "Uso de índice":

select id, name from table where name = 'Piskvor' 

Pero esta consulta necesita una tabla de búsqueda 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 particular, pero tiene que mirar esas filas en la tabla para verificar si la ubicación también coincide.

+2

"puede recuperar toda su información usando el índice" - ¿podría usar solo la segunda columna en un índice compuesto? Pensé que para 'seleccionar id, nombre de la tabla donde name = 'Piskvor'' no se usará el índice' (id, name) ', a diferencia del índice' (name, id) '. ¿Podrías aclararlo por favor? – Piskvor

+1

@Piskvor: tienes razón. Todavía puede hacer un escaneo de índice en (id, nombre) pero un índice en (nombre) permitiría una búsqueda de índice. Editaré la respuesta. – Andomar

Cuestiones relacionadas