Mantener MySQL en buen estado implica monitorizar las consultas lentas, detectar cuellos de botella y optimizar las consultas problemáticas antes de que afecten a los usuarios. MySQL ofrece varias herramientas integradas para esto: SHOW PROCESSLIST, el slow query log, EXPLAIN y el sys schema.
En este capítulo cubrimos cómo detectar y analizar consultas lentas, cómo usar EXPLAIN para entender los planes de ejecución y las métricas de InnoDB más útiles para el diagnóstico.
SHOW PROCESSLIST: ver las consultas activas
-- Ver todas las conexiones y lo que están ejecutando ahora mismo SHOW PROCESSLIST; SHOW FULL PROCESSLIST; -- muestra la consulta completa (sin truncar) -- Columnas importantes: -- Id: identificador de conexión (para KILL) -- User: usuario de la conexión -- Host: host de la conexión -- db: base de datos seleccionada -- Command: tipo de operación (Query, Sleep, ...) -- Time: segundos que lleva en ese estado -- Info: la consulta SQL (truncada en PROCESSLIST, completa en FULL) -- Matar una consulta colgada: KILL QUERY 12345; -- mata solo la consulta, no la conexión KILL 12345; -- mata la conexión completa
Slow query log: registrar consultas lentas
-- Activar el slow query log en tiempo real SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1; -- registrar consultas de más de 1 segundo SET GLOBAL log_queries_not_using_indexes = 1; -- también las que no usan índice -- Ver dónde se guarda el log SHOW VARIABLES LIKE 'slow_query_log_file';
# Analizar el slow query log con mysqldumpslow mysqldumpslow -s t -t 10 /var/log/mysql/slow.log # top 10 por tiempo total mysqldumpslow -s c -t 10 /var/log/mysql/slow.log # top 10 por número de ejecuciones # pt-query-digest (Percona Toolkit): análisis más detallado pt-query-digest /var/log/mysql/slow.log
EXPLAIN y EXPLAIN ANALYZE
-- Ver el plan de ejecución de una consulta EXPLAIN SELECT c.nombre, COUNT(p.id) AS pedidos FROM clientes c LEFT JOIN pedidos p ON p.id_cliente = c.id GROUP BY c.id\G -- EXPLAIN ANALYZE (MySQL 8.0.18+): ejecuta la consulta y muestra tiempos reales EXPLAIN ANALYZE SELECT * FROM pedidos WHERE estado = 'pagado' AND fecha > '2026-01-01'\G -- Señales de alerta en EXPLAIN: -- type = ALL → full table scan (malo para tablas grandes) -- key = NULL → no usa ningún índice -- Extra = 'Using filesort' → ordenación sin índice (lento para resultados grandes) -- Extra = 'Using temporary' → tabla temporal (puede ser lento)
El sys schema: vistas de diagnóstico listas para usar
-- Consultas más lentas del historial (usando performance_schema)
SELECT * FROM sys.statements_with_runtimes_in_95th_percentile LIMIT 10;
-- Tablas con más full scans
SELECT * FROM sys.schema_tables_with_full_table_scans;
-- Índices que no se están usando
SELECT * FROM sys.schema_unused_indexes;
-- Conexiones abiertas por usuario
SELECT * FROM sys.user_summary;
-- Espacio en disco por tabla
SELECT table_schema, table_name, sys.format_bytes(data_length) AS datos,
sys.format_bytes(index_length) AS indices
FROM information_schema.tables
WHERE table_schema = 'tienda'
ORDER BY data_length DESC;
Estado de InnoDB
-- Informe detallado del motor InnoDB: deadlocks, transacciones activas, etc. SHOW ENGINE INNODB STATUS\G -- Secciones más útiles del informe: -- TRANSACTIONS: transacciones activas y bloqueadas -- LATEST DEADLOCK: detalles del último deadlock -- BUFFER POOL AND MEMORY: estadísticas del buffer pool -- ROW OPERATIONS: operaciones de fila en curso
