2008-09-24 13 views
10

Si tengo una consulta como,¿Tiene un índice < or > consultas MySQL?

DELETE FROM table WHERE datetime_field < '2008-01-01 00:00:00' 

no tener la ayuda datetime_field columna indexada? es decir, ¿el índice solo es útil cuando se usan pruebas de igualdad (o desigualdad) o también es útil cuando se hace una comparación ordenada?

(Sugerencias para una mejor ejecución de esta consulta, sin volver a crear la tabla, también estaría bien!)

Respuesta

11

Quizás. En general, si existe dicho índice, utilizará un análisis de rango en ese índice si no hay un índice "mejor" en la consulta. Sin embargo, si el optimizador decide que el rango terminará siendo demasiado grande (es decir, incluye más de, digamos 1/3 de las filas), probablemente no use el índice en absoluto, ya que es probable que un escaneo de tabla sea Más rápido.

Use EXPLAIN (en un SELECT; no puede EXPLICAR una eliminación) para determinar su decisión en un caso específico. Es probable que esto dependerá de

  • ¿Cuántas filas hay en la tabla
  • Lo que el rango es que se está especificando
  • ¿Qué más se especifica en la cláusula WHERE. No utilizará un análisis de rango de un índice si hay otro índice que "se ve mejor".
+2

Tal vez esto debería ser una cuestión adicional, pero hay una respuesta simple (o referencia a una parte de la documentación de MySQL) que explica cómo el optimizador toma la decisión sobre el rango siendo demasiado grande? El caso específico no tiene nada más en el DÓNDE. –

1

Lo hace, consulte con un DESCRIBE SELECT FROM tabla ...

2

Un índice en el campo de fecha y hora definitivamente ayudará con las búsquedas basadas en el rango de fechas. Los usamos todo el tiempo en nuestras bases de datos y las consultas son ridículamente lentas sin los índices.

4

De MySQL Reference manual:

Un índice de árbol B se puede utilizar para las comparaciones de las columnas en las expresiones que utilizan los operadores =,>,> =, <, < =, o entre los operadores.

Para un gran número de filas, puede ser mucho más rápido buscar las filas a través de un índice de árbol que a través de una exploración de tabla. Pero como señalan las otras respuestas, use EXPLAIN para averiguar la decisión de MySQL.

Cuestiones relacionadas