OBA groeit, en de website kostte Ina handen vol werk. 1 Van de steeds weerkerende rotklusjes was het bewaken van reeksen posts door dezelfde persoon. Tot vandaag kon je door in een keer van alles te publiceren nog de voorpagina domineren. En eerdere poging om daar d.m.v. een eenvoudige technische ingreep een eind aan te maken was mislukt doordat WordPress tijdens het ontwikkelen van een plugin een update van zijn database deed.
WordPress werkt met een parameteriseerbare query die de posts ophaalt uit de database en toont aan de gebruikers. Middels een plugin kun je zelf extra voorwaarden achter die query plakken, zodat de resultaten veranderen. De hele query vervangen kan ook, maar dat is veel meer werk, met een grote kans op fouten. Ik probeerde het met een gecorreleerde subquery, maar dat leverde een dramatisch slechte performance op, zelfs als ik een extra index op de posts tabel maakte. De index werd door de optimizer gewoon genegeerd, en als ik hem forceerde, bleek de snelheid onaanvaardbaar.
Toen besloot ik een view te maken en in een subquery aan deze view te refereren :
CREATE VIEW ” . $table_name . ” AS (SELECT max(ID) from $wpdb->posts where post_status = ‘publish’ and post_type = ‘post’ group by post_author)”;
Ik wilde eigenlijk een view met 2 kolommen maken, maar om ondoorgrondelijke redenen kon je de kolom max(ID) geen andere naam geven en max(ID) refereert aan de niet bestaande kolom “ID”, dus dat werkte niet. Dan maar 1 kolom, en een select *. En nu de query :
mysql> select post_author, ID, post_title from wp_posts where ID in (select * from wp_maxidperuser); +-------------+-------+--------------------------------------------------------------+ | post_author | ID | post_title | +-------------+-------+--------------------------------------------------------------+ | 2 | 38175 | muziektest | | 1 | 40725 | SONNY BOY **********!!! | | 580 | 34670 | exvkblog | | 577 | 34671 | Hoe lang nog | | 581 | 34675 | Hoe komt het dat de eerste inzending nauwelijks bekeken is ? | | 585 | 34695 | Al wat is. | | 578 | 34699 | Welkom op deze planeet | | 586 | 35334 | PS06 - De politiek in | | 607 | 36591 | Niets van tederheid | | 3841 | 37616 | Bijdrage voor Volkskrantcolumn wedstrijd. | +-------------+-------+--------------------------------------------------------------+ 10 rows in set (0.00 sec)
Zo, dat is wat sneller dan een halve dag.
Een view wordt bijgewerkt op het moment dat je de tabel(len) waarop hij gebaseerd is bijwerkt. Als de optimiser van MySQL intelligent is, ziet hij dat hij niets hoeft te sorteren, omdat ID steeds groter is dan de vorige max.
Bij het installeren van de plugin die ik gemaakt heb wordt de view automatisch aangemaakt en bij deactiveren weer verwijderd. Het werkt razendsnel, en het ontgaat me dan ook waarom de MySQL optimiser zelf niet kon uitrekenen dat dit de snelste methode was.
Leave a Reply