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.










.jpeg)



