Rendimiento y monitorización

Consultas SQL lentas de tipo "SELECT SQL_CALC_FOUND_ROWS"

Revisado el 3 min de lectura wordpress rendimiento base de datos

Al investigar lentitud en WordPress puedes encontrar consultas con esta estructura:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta
ON ( wp_posts.ID = wp_postmeta.post_id )
...
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp_posts.ID = wp_postmeta.post_id )
WHERE 1=1
...

Los fragmentos anteriores son ilustrativos, no consultas completas para ejecutar. SQL_CALC_FOUND_ROWS permite calcular el total que coincide con los filtros aunque la consulta devuelva solo una página de resultados. Puede aparecer con distintas tablas, no exclusivamente posts y postmeta.

Al crecer las tablas, una consulta que examina demasiadas filas puede tardar más y convertirse en un cuello de botella. El efecto depende de los datos y del plan de ejecución.

La presencia de SQL_CALC_FOUND_ROWS no identifica por sí sola la causa. El coste puede depender de los filtros, un JOIN sobre metadatos, el volumen de resultados, el orden aplicado o los índices que ya existan. Localiza primero el plugin, tema o petición que genera la consulta mediante PHP X-Ray.

Antes de crear un índice, guarda una copia recuperable y ejecuta EXPLAIN sobre la consulta completa. Comprueba también los índices actuales de la tabla:

SHOW INDEX FROM wp_postmeta;

Un índice combinado como (post_id, meta_key) puede ayudar a determinados planes de ejecución, pero no es una solución universal y añade coste a cada escritura. Si el análisis confirma que falta, utiliza una herramienta mantenida como Index WP MySQL For Speed o pide al desarrollador que diseñe y pruebe el índice sobre un clon.

Después del cambio, repite EXPLAIN, compara el tiempo con varias ejecuciones y verifica inserciones, búsquedas, administración y tareas programadas. Revierte el índice si no mejora el plan o penaliza otras operaciones.

Si el código no necesita paginación

En una consulta propia construida con WP_Query, el desarrollador puede evaluar no_found_rows => true cuando no se utiliza el total ni el número de páginas. No lo apliques globalmente: rompería funciones que sí dependen de esos valores. La referencia de WP_Query describe el parámetro.

Revisa también filtros, orden y número de resultados solicitados. No edites el núcleo de WordPress ni elimines la cláusula de una consulta generada solo porque aparezca en el informe. La validación debe comprobar resultados y paginación, además del tiempo.

También te puede ayudar

¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.