La característica MySQL individual más útil para WordPress
La mayoría de sitios WordPress lentos tienen 1-5 queries lentas específicas que dan cuenta del 80%+ de la lentitud. Encuentra esas queries, optimízalas, y el sitio es rápido. Todo lo demás (caching, CDN, optimización de imágenes) ayuda pero no arreglará el problema subyacente.
El slow query log de MySQL identifica exactamente esas 1-5 queries.
Habilitando el slow query log
En MySQL:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL log_queries_not_using_indexes = 'ON';O persistente en /etc/mysql/my.cnf:
[mysqld]
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/slow.log
log_queries_not_using_indexes = 1long_query_time = 1 loguea queries tomando 1+ segundo. Empieza con 1. Una vez que arregles esos, baja a 0.5, después 0.2.
Leyendo el slow log
Una entrada del slow query log se ve como:
# Time: 2026-05-13T10:32:15.123456Z
# Query_time: 3.245678 Lock_time: 0.000123 Rows_sent: 1 Rows_examined: 850000
SELECT post_id FROM wp_postmeta WHERE meta_value LIKE '%search%';Campos clave: - Query_time: cuánto tomó la query - Lock_time: cuánto esperó la query por locks - Rows_sent: filas realmente devueltas - Rows_examined: filas que MySQL tuvo que leer
Señal de peligro: alto Rows_examined con bajo Rows_sent. Índice faltante.
Agregando con mysqldumpslow
# Top 20 por tiempo total
mysqldumpslow -s t -t 20 /var/log/mysql/slow.log
# Top 20 por tiempo promedio
mysqldumpslow -s at -t 20 /var/log/mysql/slow.log
# Top 20 por conteo
mysqldumpslow -s c -t 20 /var/log/mysql/slow.logEl output se ve como:
Count: 5234 Time=2.45s (12823s) Lock=0.001s (5.2s) Rows=1.0 (5234)
SELECT meta_value FROM wp_postmeta WHERE post_id = N AND meta_key = 'S'Count: 5234 corridas × 2.45s = 12,823s total. Arregla esto y ahorras 3.5 horas de tiempo MySQL por ventana de log.
Patrones y sus significados
Patrón A — escaneo postmeta sin índice
SELECT meta_value FROM wp_postmeta WHERE post_id = N AND meta_key = 'S'Con Rows_examined > 100, falta índice compuesto. Añade:
ALTER TABLE wp_postmeta ADD INDEX idx_post_meta_key (post_id, meta_key);Patrón B — query de opciones autoload
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'Si lento (>500ms), payload autoload muy grande. Limpia.
Patrón C — WP_Query grande con meta_query
SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts
INNER JOIN wp_postmeta ON ...
WHERE wp_postmeta.meta_key = '_price'Múltiples joins postmeta + SQL_CALC_FOUND_ROWS = catastrófico. Deshabilita SQL_CALC_FOUND_ROWS o mueve a tabla de lookup.
Patrón D — autenticación wp_users
SELECT * FROM wp_users WHERE user_login = 'S' OR user_email = 'S'Si frecuente y lento, bot brute-forceando. Bloquea en WAF.
Patrón E — queries de comentarios
SELECT * FROM wp_comments WHERE comment_status = 'hold'Con 100,000+ comentarios pendientes, ralentiza admin. Borra spam:
DELETE FROM wp_comments WHERE comment_approved = 'spam';El workflow completo
# 1. Habilita slow log
mysql -e "SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1;"
# 2. Navega sitio o espera tráfico por 30+ minutos
# 3. Deshabilita para que no crezca por siempre
mysql -e "SET GLOBAL slow_query_log = 'OFF';"
# 4. Agrega
mysqldumpslow -s t -t 20 /var/log/mysql/slow.log
# 5. Para cada top 5, EXPLAIN
mysql -e "EXPLAIN <query lenta>;"
# 6. Aplica arreglo (índice, refactor, cache)
# 7. Re-habilita, re-pruebaCuándo EXPLAIN es necesario
EXPLAIN SELECT meta_value FROM wp_postmeta WHERE post_id = 12345 AND meta_key = '_yoast_wpseo_metadesc';Enfócate en: - type: ALL = escaneo completo (malo); ref, eq_ref = lookup de índice (bueno) - key: qué índice usado; NULL = sin índice - rows: filas estimadas leídas - Extra: Using index bueno; Using filesort, Using temporary malo
Los índices tienen costo
Cada índice: - Cuesta espacio en disco (5-30% del tamaño de tabla) - Ralentiza INSERT/UPDATE/DELETE - Toma tiempo para construir en datos existentes
Solo añade índices que mides ayudar.
Errores comunes al leer slow logs
- Confiar en resultados de `long_query_time = 10` — empieza en 1 segundo
- Optimizar queries que corren 5 veces/día — enfócate en alta frecuencia
- Añadir índices sin `ALGORITHM=INPLACE` — bloquea tabla durante creación
- Ignorar lock_time — alto lock_time significa contención de locks
Cuándo llamar a un especialista
La optimización de base de datos es altamente apalancada. Una auditoría + arreglo de 4 horas puede bajar TTFB en 50-90%.
Auditoría de velocidad incluyendo deep-dive de base de datos. Para rendimiento más amplio ve recuperación de velocidad.

