Blog de Analytics y Gestión de Datos

12/05/2025 | Ing. Fabiana Sasia

Database Tuning – MySQL

Tuning basado en EXPLAIN

1. ¿Qué es EXPLAIN?

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.

2. ¿Qué buscamos?

Al analizar un plan buscamos principalmente:

  • tablas que realizan Full Table Scan;
  • índices que no se utilizan;
  • demasiadas filas examinadas;
  • JOINs costosos;
  • ordenamientos;
  • diferencias importantes entre filas estimadas y reales.

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.

3. Índices

EXPLAIN permite observar información como:

  • possible_keys;
  • key;
  • key_len;
  • rows;
  • filtered.

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:

  • baja selectividad;
  • estadísticas;
  • cantidad de filas;
  • forma de la consulta.

4. EXPLAIN ANALYZE

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.

5. JOINs

El plan permite analizar:

  • orden de acceso a las tablas;
  • método de acceso;
  • índices utilizados;
  • cantidad de filas procesadas.

El objetivo es determinar si MySQL está procesando las tablas en un orden eficiente y si existen índices adecuados para los JOINs.

6. Optimizer Hints

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.

7. ¿Puede MySQL forzar un plan?

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:

  • Optimizer Hints;
  • optimizer_switch;
  • índices;
  • estadísticas;
  • modificación de SQL.

Por lo tanto, el enfoque recomendado es influir sobre las decisiones del Optimizer, en lugar de almacenar y fijar un plan completo.

8. ¿Cómo optimizamos?

Dependiendo del problema podemos:

  • crear o modificar índices;
  • actualizar estadísticas;
  • modificar la consulta;
  • mejorar los filtros;
  • reducir la cantidad de filas procesadas;
  • revisar el orden de los JOINs;
  • utilizar Optimizer Hints;
  • revisar opciones del Optimizer.

Después debemos volver a ejecutar:

EXPLAIN ANALYZE

y comparar los resultados.

9. Objetivo

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.