Translate

domingo, 10 de mayo de 2026

Cómo usar EXPLAIN en MySQL para optimizar tus consultas


EXPLAIN te muestra el plan de ejecución de una consulta SQL.


En otras palabras, responde preguntas como:

  • ¿Qué tablas se recorren?
  • ¿En qué orden?
  • ¿Se están usando índices?
  • ¿Cuántas filas se estiman procesar?


EXPLAIN 

SELECT * 

FROM libro 

WHERE titulo = 'El Quijote';


Salida típica:


| id | select_type | table | type | possible_keys | key  | rows | Extra       |

| -- | ----------- | ----- | ---- | ------------- | ---- | ---- | ----------- |

| 1  | SIMPLE      | libro | ALL  | idx_titulo    | NULL | 1000 | Using where |


Qué podemos saber con esto, sin ser un erudito: 

type = ALL → Full Table Scan ❌

key = NULL → no está usando ningún índice


Esto significa que MySQL recorre toda la tabla.


Veamos agregar un indice: 

CREATE INDEX idx_titulo ON libro(titulo);


Volvemos a ejecutar:

EXPLAIN 

SELECT * 

FROM libro 

WHERE titulo = 'El Quijote';


Nueva salida:

| type | key        | rows |

| ---- | ---------- | ---- |

| ref  | idx_titulo | 1    |


✅ Ahora sí:

  • Usa índice
  • Escanea pocas filas
  • Mucho más eficiente


Veamos las columnas clave de EXPLAIN

type (MUY importante)

Indica cómo accede a la tabla:


| type   | Significado             |

| ------ | ----------------------- |

| ALL    | Full scan (malo) ❌      |

| index  | Scan de índice completo |

| ref    | Uso de índice 👍        |

| eq_ref | Uso óptimo 🚀           |

| const  | Mejor caso posible 💎   |


key

  • Índice que se está utilizando
  • Si es `NULL` → problema 😬


rows

  • Cantidad estimada de filas a procesar
  • Mientras menor, mejor


Extra

Algunos valores importantes:


| Extra           | Significado             |

| --------------- | ----------------------- |

| Using where     | Filtro aplicado         |

| Using index     | Index-only scan 🚀      |

| Using temporary | Tabla temporal ⚠️       |

| Using filesort  | Ordenamiento costoso ⚠️ |


Veamos un ejemplo con JOIN


EXPLAIN

SELECT l.titulo, a.nombre

FROM libro l

JOIN autor a ON l.autor_id = a.id

WHERE a.nombre = 'Cervantes';


👉 Cosas a observar:

  • Orden de las tablas
  • Índices en autor.nombre y libro.autor_id
  • Tipo de join (`ref`, `eq_ref`, etc.)


Problema típico: filesort

EXPLAIN

SELECT * 

FROM libro

ORDER BY fecha_publicacion;


Si ves: Using filesort


MySQL está ordenando en memoria (o peor, en disco)

Solución:

CREATE INDEX idx_fecha ON libro(fecha_publicacion);


EXPLAIN ANALYZE (MySQL 8+)


Mysql agrega el analyze que es propio de mysql, por lo menos no conozco en otras bases. (si conocen me dicen en los comentarios) Analyze corre la query y nos tira data más precisa. Tema que hay que esperar a que ejecute la query. 


EXPLAIN ANALYZE

SELECT * 

FROM libro 

WHERE titulo = 'El Quijote';


Que diferencia tiene con explain clave:


| EXPLAIN             | EXPLAIN ANALYZE |

| Estimaciones         | Ejecución real  |

| No ejecuta query   | Ejecuta query   |

| Rápido                   | Más preciso     |


Ejemplo:


-> Index lookup on libro using idx_titulo

(cost=0.35 rows=1)

(actual time=0.01..0.02 rows=1 loops=1)


Como conclusión, EXPLAIN no es opcional: es una herramienta esencial.


Te permite:

  • Entender cómo piensa MySQL
  • Detectar problemas de performance
  • Validar el uso de índices
  • Optimizar queries complejas


Un buen flujo de trabajo sería:


1. Escribir la query

2. Ejecutar EXPLAIN

3. Detectar problemas

4. Agregar índices / refactorizar

5. Validar con EXPLAIN ANALYZE


Nunca andar tirando índices a lo loco o trabajar a tientas. 

No hay comentarios.:

Publicar un comentario