Tutorial completo de MySQL 8: instalación, administración, tipos de datos y backup (2026)

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP