para la consulta:
WHERE NOW() >= date_from
AND NOW() <= date_to
Un índice compuesto (date_from, date_to)
es inútil.
Cree ambos índices: (date_from)
y (date_to)
y deje que el optimizador de SQL decida cada vez cuál usar. Dependiendo de los valores y la selectividad, el optimizador puede elegir uno u otro índice. O ninguno de ellos. No hay una manera fácil de crear un índice que tenga en cuenta ambas condiciones.
(Un índice espacial podría ser utilizado para optimizar tal condición, si se pudiera traducir las fechas a la latitud y longitud).
actualización
Mi error. Un índice en (date_from, date_to, object_id)
puede y se usa de hecho en algunas situaciones para esta consulta. Si la selectividad del NOW() <= date_from
es lo suficientemente alta, el optimizador elige usar este índice, que haciendo un escaneo completo en la tabla o usando otro índice. Esto se debe a que es un índice de cobertura, lo que significa que no es necesario obtener datos de la tabla, solo se requiere la lectura de los datos del índice.
Nota secundaria (no relacionada con el rendimiento, solo la corrección de la consulta). Su condición es equivalente a:
WHERE CURRENT_DATE() >= date_from
AND (CURRENT_DATE() + INTERVAL 1 DAY <= date_to
OR (CURRENT_DATE() = NOW()
AND CURRENT_DATE() = date_to
)
)
¿Está seguro de que desea o quiere esto:
WHERE CURRENT_DATE() >= date_from
AND CURRENT_DATE() <= date_to
La función NOW()
devuelve un DATETIME
, mientras CURRENT_DATE()
devuelve un DATE
, sin la parte de tiempo.
Siento que date_from es mejor para crear el índice en lugar de combinar –
Usted [probablemente] se siente mal. Supongamos que hay 10 filas para algún objeto. 8 tienen una fecha de finalización en el pasado, 1 es "actual" y 1 es "futuro". ¿Cuántos de ellos se filtran por "NOW()> date_from" (respuesta: solo uno) y cuántos se filtran por "NOW()