Cómo detectar consultas lentas en MySQL paso a paso (slow query log)
Si tu base de datos va lenta, hay una pregunta clave que separa a juniors de seniors:
¿Sabes exactamente qué consultas están siendo lentas?
Porque optimizar sin datos reales es adivinar.
MySQL ya trae una herramienta brutal para esto y muchos nunca la activan:
👉 el Slow Query Log.
En este artículo te explico paso a paso:
- qué es
- cómo activarlo
- cómo leerlo
- y cómo usarlo para mejorar rendimiento de verdad
¿Qué es el Slow Query Log de MySQL?
El slow query log es un registro donde MySQL guarda:
- consultas que tardan más de X segundos
- consultas que no usan índices (opcional)
- estadísticas de tiempo y filas leídas
📌 En otras palabras:
Es la lista real de las consultas que están dañando tu sistema.
No teorías. No suposiciones. Datos reales de producción.
Por qué deberías usarlo siempre en sistemas reales
Sin slow query log:
- optimizas a ciegas
- tocas cosas que no hacen falta
- pierdes tiempo
Con slow query log:
- ves las consultas problemáticas reales
- priorizas por impacto
- mejoras rápido
👉 Es imprescindible en:
- sistemas legacy
- MySQL en producción
- proyectos con crecimiento constante
Paso 1️⃣ — Comprobar si el slow query log está activo
Ejecuta:
SHOW VARIABLES LIKE 'slow_query_log';
Resultados posibles:
OFF→ desactivadoON→ activo
Comprueba también dónde se guarda:
SHOW VARIABLES LIKE 'slow_query_log_file';
Paso 2️⃣ — Activar el slow query log (temporal)
⚠️ Esto NO reinicia MySQL y es seguro.
SET GLOBAL slow_query_log = 'ON';
Define el umbral (en segundos):
SET GLOBAL long_query_time = 1;
👉 Esto registra consultas que tarden más de 1 segundo.
Paso 3️⃣ — Activarlo de forma permanente (producción)
Edita tu my.cnf o mysqld.cnf:
[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 1
Luego reinicia MySQL:
sudo systemctl restart mysql
📌 Esto es lo correcto en servidores reales.
Paso 4️⃣ — Registrar consultas SIN índice (muy útil)
Muchos problemas vienen de consultas que no usan índices.
Actívalo así:
SET GLOBAL log_queries_not_using_indexes = ON;
⚠️ Ojo:
- Útil para diagnóstico
- Puede generar mucho log
- Úsalo con criterio
Paso 5️⃣ — Leer el archivo de slow queries
Ejemplo de entrada típica:
# Time: 2024-01-20T12:33:01 # Query_time: 3.245 Lock_time: 0.000 Rows_sent: 10 Rows_examined: 105432 SELECT * FROM orders WHERE user_id = 42 ORDER BY created_at DESC LIMIT 10;
Qué debes mirar SIEMPRE:
Query_time→ tiempo realRows_examined→ filas leídas (clave)Rows_sent→ filas devueltas
📌 Si Rows_examined es enorme → mal diseño.
Paso 6️⃣ — Usar mysqldumpslow (herramienta clave)
MySQL trae una herramienta brutal que muchos ignoran:
mysqldumpslow /var/log/mysql/mysql-slow.log
Opciones útiles:
# Top 10 consultas más lentas mysqldumpslow -s t -t 10 mysql-slow.log # Top 10 por filas examinadas mysqldumpslow -s r -t 10 mysql-slow.log
👉 Esto te dice dónde atacar primero.
Paso 7️⃣ — Analizar la consulta con EXPLAIN
Nunca optimices sin esto:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 ORDER BY created_at DESC LIMIT 10;
Busca:
type = ALL→ alertakey = NULL→ no usa índicerowsalto → problema
Paso 8️⃣ — Caso real típico (muy común)
Consulta lenta detectada:
SELECT * FROM users WHERE DATE(created_at) = '2024-01-01';
❌ Problema
- usa función en columna
- rompe el índice
- table scan
✅ Solución correcta
SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02';
Resultado:
- índice usable
- menos filas
- respuesta inmediata
Paso 9️⃣ — Cuándo NO dejar el slow query log activo
No es magia, tiene coste.
❌ No lo dejes activo:
- con
long_query_timemuy bajo - en servidores ultra críticos sin control
- sin rotación de logs
Buenas prácticas
- usa rotación (
logrotate) - revisa semanalmente
- ajusta el umbral
Checklist rápido de uso correcto
✔ Activar slow query log
✔ Ajustar long_query_time
✔ Registrar consultas sin índice (temporal)
✔ Analizar con mysqldumpslow
✔ Usar EXPLAIN
✔ Crear índices reales
✔ Medir antes y después
Conclusión
El slow query log es:
- simple
- potente
- subestimado
Si no sabes qué consultas son lentas,
no estás optimizando… estás adivinando.
👉 Actívalo, léelo y deja que MySQL te diga la verdad.