Com enfonsar un WordPress 2.3

Avui m’he entretingut a fer proves amb WordPress 2.3, el gestor de blogs amb el que funciona aquest seti, i després de força trastejar puc confirmar que WordPress no suporta blocs grans.

Què vol dir grans?


mysql> select count(ID) from wp_posts;
+-----------+
| count(ID) |
+-----------+
|    132872 |
+-----------+

mysql> select count(cat_ID) from wp_categories;
+---------------+
| count(cat_ID) |
+---------------+
|          2071 |
+---------------+
mysql> select count(rel_id) from wp_post2cat;

+---------------+
| count(rel_id) |
+---------------+
|        132872 |
+---------------+

Estem parlant d’un blog amb un xic més de 130.000 entrades distribuïdes en poc més de 2.000 categories, el resultat es desastrós.

El element testejat és un WordPress 2.3 amb tots els plugins desactivats i el tema per defecte, en un entorn restringit on tant sols hi havia peticions a aquest WordPress que atacava un Apache que tant sols servia aquesta web i un MySQL que tant sols contenia aquesta BD. El MySQL l’he anat reconfigurant sense èxit.

Una petició a la home o a qualsevol categoria generava una slow-query de més de 140 sg. que deixava fregit el MySQL.

El motiu, les querys són massa complexes i preveuen massa casuístiques que no tenen perquè donar-se, com per exemple un Group By que ignorava qualsevol índex i que controlava que els posts mostrats en un moment X no estiguessin relacionats en diverses categories (en el meu cas, un post = una categoria).

He toquetejat una línia del codi de WordPress per adaptar-lo a les meves necessitats i el rendiment és òptim, la línia en qüestió es troba a wp-includes/query.php i el toqueteix ha consistit en passar d’això:

$request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join
WHERE 1=1 $where $groupby ORDER BY $orderby $limits";

a això:

 $request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join
WHERE 1=1 $where $limits";

Òbviament, es tracta d’un cas particular i que en cap cas es pot globalitzar.

Prometo explicar-vos el resultat, però de moment he reduït fullscans del MySQL i filesorts innecessaris, de manera que les slow-querys (1 sg.) han desaparegut dels logs.