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 → desactivado
  • ON → 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 real
  • Rows_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 → alerta
  • key = NULL → no usa índice
  • rows alto → 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_time muy 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.