2012-06-12 16 views
7

considerar los dos siguientes explica:Sin índice en! =?

EXPLAIN SELECT * FROM sales WHERE title != 'The' 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ALL  title  NULL NULL NULL 41707 Using where 

Y -

EXPLAIN SELECT * FROM sales WHERE title = 'The' 
id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ref  title   title 767 const 1 Using where 

¿Por qué la consulta != tienen una clave NULL? ¿Por qué no usa title? ¿Qué causa que una declaración = pueda utilizar un índice pero no un !=?

Respuesta

11

No tiene sentido utilizar el índice a menos que title sea exactamente title sea exactamente 'The' con mucha frecuencia.

Como casi todas las filas deben seleccionarse, no se gana nada con el uso de un índice. En realidad, puede ser costoso utilizar un índice, que es probablemente lo que determina su motor MySQL, por lo que opta por no usar el índice.

comparar la cantidad de trabajo realizado en estas dos situaciones:

Utilizando el índice:

1) Lea todo el árbol de índice en la memoria.
2) Busque en el árbol de índice el valor 'The' y filtre esas entradas.
3) Lea cada fila excepto las pocas excepciones (que probablemente se encuentran en los mismos bloques del disco que las filas que necesitan ser leídas, por lo que es probable que se lea toda la tabla) en la memoria.

Sin el índice:

1) Lea cada fila en la memoria y al leer a filtrar a cabo en cualquier lugar title = 'The' del conjunto de resultados

+1

Para ampliar sobre ese - seleccionar cada fila donde el título no es "El" devolverá casi todas las filas de la tabla de todos modos, por lo que no tiene sentido utilizar un índice para esta consulta. (Ya que tendrá que escanear toda la tabla para devolver todas esas filas). – duskwuff

Cuestiones relacionadas