En MySQL, una de las principales herramientas para analizar una consulta es:
EXPLAIN
En versiones modernas también podemos utilizar:
EXPLAIN ANALYZE
Esto permite conocer cómo MySQL planea ejecutar la consulta y, con EXPLAIN ANALYZE, comparar el comportamiento estimado con el real.
Al analizar un plan buscamos principalmente:
Una de las columnas importantes de EXPLAIN es:
type
Entre los valores podemos encontrar:
const
eq_ref
ref
range
index
ALL
En general, ALL indica un Full Table Scan.
Pero:
Un Full Table Scan no es automáticamente un problema.
EXPLAIN permite observar información como:
Un caso típico es que exista un índice potencialmente útil pero MySQL decida no utilizarlo.
Hay que analizar por qué.
Puede ser debido a:
EXPLAIN ANALYZE permite observar cómo se comportó realmente la consulta.
Esto resulta especialmente útil para detectar diferencias entre:
Estimated Rows
vs.
Actual Rows
Si MySQL esperaba pocas filas pero realmente procesó millones, la estimación puede haber influido negativamente en el plan elegido.
El plan permite analizar:
El objetivo es determinar si MySQL está procesando las tablas en un orden eficiente y si existen índices adecuados para los JOINs.
MySQL permite utilizar Optimizer Hints para influir en determinadas decisiones del Optimizer.
También dispone de opciones de optimizer_switch para controlar determinadas estrategias de optimización.
Esto permite orientar el comportamiento del Optimizer en casos concretos.
Sin embargo, no debe considerarse equivalente a mantener un plan completo como ocurre con SQL Server o mediante SQL Plan Baselines en Oracle.
MySQL no dispone del mismo mecanismo de Forced Plan de SQL Server ni de SQL Plan Baselines de Oracle.
La intervención se realiza principalmente mediante:
Por lo tanto, el enfoque recomendado es influir sobre las decisiones del Optimizer, en lugar de almacenar y fijar un plan completo.
Dependiendo del problema podemos:
Después debemos volver a ejecutar:
EXPLAIN ANALYZE
y comparar los resultados.
El objetivo es reducir:
Rows examined → I/O → CPU → Execution Time
En MySQL, EXPLAIN y EXPLAIN ANALYZE permiten entender cómo el Optimizer está resolviendo una consulta y dónde existe una oportunidad de mejora.