Ho appreso da questo post che nei giorni scorsi c’è stato in intenso ed interessante dibattito su una delle più frequentate mailing list a tema wordpress, a proposito dell’apparente lentezza di alcuni blog con “qualche migliaio” (quindi non tanti) di post. L’autore di uno di questi riportava in pratica l’esecuzione di migliaia di query per l’esecuzione di una singola pagina.
Il problema di fondo nasce nel meccanismo con cui WP gestisce i permalink, ovvero quella funzionalità che trasforma in forma mooolto più google friendly la url atrimenti enigmatica di un post.
WP offre grande flessibilità nella selezione della struttura dei permalink. Bisogna tuttavia evitare di cadere nell’errore di selezionare come prma chiave del permalink una variabile testuale (ad esempio %postname% o %category%). In questo caso infatti il motore di elaborazione dei permalink non potrà immediatamente distiguere il post da una page, e sarà quindi costretto ad un po’ di lavoro in più. Inoltre (e qui il problema di performance rischia di trasformarsi in un bug!) tutto il set di rewrite rules viene memorizzato nel database, e trattato da WP come una option, costringendo appunto il server a (potenzialmente) interminabili operazioni per redirigervi alla giusta pagina.
Recently I discovered that the current way wordpress handles permalinks is not scalable. All rewrite_rules are at the moment held in a single database field in the wp_options table. If you have a few dozens pages and posts, you have maybe a few hundred rewrite_rules in it and all is well. But as soon as you start to have a few hundred pages and attachments, the amount of rewrite_rules explodes as well as the field size. This also depends on the permalinks settings. On one of my sites I can’t even open the database field to take a look because my browser and text editor crash because of its size.
Se questo problema è poco sentito per i blog – dato che questi hanno tipicamente una struttura di permalink che comprende l’anno ed il mese di pubblicazione – rischia di diventarlo se volete usare WordPress come un CMS.
Assicuratevi quindi che la vostra struttura di permalink inizi con una variabile numerica.
Anche al documentazione di WordPress è stata aggiornata a seguito della discussione.