Recientemente, hemos depurado problemas de rendimiento en instalaciones WordPress con un número alto de registros en la tabla posts (+600.000) al tratar de filtrar estos posts por categorías, generando consultas SQL extremadamente lentas que colapsaban o repercutían en el rendimiento de forma muy negativa.
La consulta SQL problemática proviene de la función get_sql_for_clause del fichero wp-includes/class-wp-tax-query.php, y usa una unión de tipo LEFT JOIN, hacía la tabla term_relationships, para finalmente agrupar por identificador, ordenar por fecha los posts y limitar los resultados. En un número de registros medio, no tiene mayor problema, pero cuando la categoría (o cualquier taxonomía) devuelve un número alto de resultados, la consulta puede demorar hasta varios minutos.
La solución pasa por sustituir el LEFT JOIN de la consulta SQL por una subquery o subconsulta, lo que permite devolver el rendimiento a milisegundos con independencia de la cantidad de los datos en la tabla.
Por suerte hay un reporte de mejora abierto en WordPress en lo que se trata una solución bastante sencilla a nivel código que conlleva apenas dos pequeñas modificaciones en los ficheros wp-includes/class-wp-tax-query.php y wp-includes/class-wp-query.php.
De momento nosotros mismos hemos testeado estos cambios sugeridos con muy buenos resultados, y aplicado en instalaciones que hemos detectado estaban teniendo graves problemas de funcionamiento derivados de estas consultas SQL.
Para el resto de instalaciones de WordPress donde no se tengan problemas de funcionamiento, no recomendamos aplicar los cambios y lo mejor es esperar a una solución oficial por parte de WordPress en forma de actualización, con suerte el uso de subconsultas se irá incrementando en el núcleo de WordPress con una ganancia de rendimiento en todos los proyectos.