¿Por qué mysql ignora un índice?
La consulta problemática
SELECT Id, Nombre, Fecha
FROM Ventas
WHERE YEAR(Fecha) = 2024;Aunque exista un índice en la columna Fecha, MySQL no lo utiliza.
Plan de ejecución
El optimizador de MySQL elige un Full Table Scan (escaneo completo de la tabla), incluso cuando la tabla contiene millones de filas.
Esto ocurre porque la función YEAR() se aplica directamente sobre la columna indexada.
Qué ocurre
- La función "YEAR()" en la cláusula "WHERE" impide que MySQL use el índice.
- Aunque el índice existe, la función aplicada a la columna lo vuelve inutilizable.
- El resultado es un escaneo completo de la tabla y un peor rendimiento.
Dato clave
El índice no se utiliza cuando:- Se aplican funciones a la columna, como "YEAR()", "MONTH()", "DATE()", "UPPER()", etc..
- Se realizan conversiones de tipo implícitas o explícitas.
- Se compara con un valor que modifica el tipo de dato.
- La columna indexada queda en el lado derecho de la condición o dentro de una expresión.
Solución: consultas sargables
SELECT Id, Nombre, Fecha
FROM Ventas
WHERE Fecha >= '2024-01-01' AND Fecha < '2025-01-01';- Se utiliza el índice de la columna
Fecha. - Se obtiene mejor rendimiento.
- Se reduce la carga en el servidor.
Conclusión
En muchos casos el problema no radica en la existencia del índice, sino en la forma en que se escribe la consulta.Una consulta sargable permite que el optimizador de MySQL tome mejores decisiones de ejecución.