13-10-2026

¿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';
Con esta reescritura:
  • 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.