Bei meinen Recherchen wie ich meinem etwas leistungsschwachen Server noch etwas von der Last mit WordPress abnehmen kann, bin ich über diesen Artikel bzw. dessen englische Quelle gestolpert, die sich merkwürdig anhörten. Die Artikel sind zwar von Anfang 2008, womit das Verhalten ggf. nur bei alten WP-Versionen autritt, die Kommentare reichen aber bis Dezember 2008 wo schon die aktuelle Version im Umlauf war.
Es geht darum, dass man WordPress bzw. die Themen damit schneller machen kann wenn man die Config-Angaben in den Templates statisch hinterlegt. Es wird behauptet dass damit […]you can remove 11 queries to the database, and this can highly speed up your theme[…].
Ein kurzer Test am eigenen Blog belegt, dass das nicht stimmt. Die Config-Werte werden, so wie sich das auch gehört, am Stück eingelesen und Programmintern gecacht. Das macht den Optimierungseffekt der vorgeschlagenen Maßnahmen zunichte. Außer man gehört der Erbsenzähler-PHP-Echo-Statt-Print-Benutzen Fraktion an, dann sollte man das trotzdem unbedingt machen ( sorry Daniel, aber in dieser Disskusion ist noch nicht das letzte Wort gefallen 😉
Und so kann man’s selber testen:
- MySQL Query-Log einschalten
- vi /etc/mysql/my.cnf die Zeile #log = /var/log/mysql/mysql.log auskommentieren
- MySQL neu starten (reload reicht nicht!)
- sudo /etc/init.d/mysql restart
- Abfrage starten
- Den Blog ein mal im Browser aufrufen
Die Abfragen werden in der Datei /var/log/mysql/mysql.log geloggt. Danach sollte man, wenn der Blog live im Netz steht, das Logging schleunigst wieder abschalten. Erstens bremst es MySQL stark aus und zweitens wird die Datei sonst schnell sehr groß.
Bei mir ergeben sich ganze 23 Abfragen plus Connect und Disconnect. Die Config-Tabelle selbst wird nur zwei mal abgefragt und keines der angeblich wegoptimierten Abfragen ist dabei (siehe Liste weiter unten). Und in meinem Thema stehen die Config-Angaben nicht statisch drin. Alle anderen Abfragen betreffen den Inhalt. Alles in allem wenig Optimierungsbedürftig.
Fazit
Auch wenn man oft den Glauben schon verloren hat, manchmal arbeiten Programme auch mal so wie es sich gehört. Selbst in PHP geschriebene *duckUndWegrenn*
Hier mal meine komplette Liste das SQL-Abfragen beim Aufruf der Startseite (die IDs sind anonymisiert). Bei Unterseiten ist das ähnlich, nur kommen da noch Abfragen über die Kategorien dazu:
Connect wp@tobias-tacke.de on
Init DB wp
SELECT option_value FROM wp_options WHERE option_name = 'siteurl'
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag') AND tr.object_id IN (301, 302, 303, 304, 305) ORDER BY t.name ASC
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (301, 302, 303, 304, 305)
SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('category') ORDER BY t.name ASC
SELECT object_id, term_taxonomy_id FROM wp_term_relationships INNER JOIN wp_posts ON object_id = ID WHERE term_taxonomy_id IN (1,2,3,4,5,6,7,8,9) AND post_type = 'post' AND post_status = 'publish'
SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('link_category') AND tt.count > 0 ORDER BY t.name ASC
SELECT * , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated FROM wp_links INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = 'Y' AND ( tt.term_id = 16 ) AND taxonomy = 'link_category' ORDER BY link_name ASC
SELECT * , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated FROM wp_links INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = 'Y' AND ( tt.term_id = 15 ) AND taxonomy = 'link_category' ORDER BY link_name ASC
SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC
SELECT * FROM wp_posts WHERE (post_type = 'page' AND post_status = 'publish') ORDER BY post_title ASC
SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 10
SELECT * FROM wp_comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 5
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 11 AND comment_parent = 0 AND comment_date_gmt < '2009-02-05 22:13:29'
SELECT * FROM wp_posts WHERE ID = 11 LIMIT 1
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 12 AND comment_parent = 0 AND comment_date_gmt < '2009-01-19 23:15:53'
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 13 AND comment_parent = 0 AND comment_date_gmt < '2009-01-19 23:09:05'
SELECT * FROM wp_posts WHERE ID = 13 LIMIT 1
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 14 AND comment_parent = 0 AND comment_date_gmt < '2009-01-19 14:35:26'
SELECT * FROM wp_posts WHERE ID = 14 LIMIT 1
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 15 AND comment_parent = 0 AND comment_date_gmt < '2009-01-05 10:24:01'
SELECT * FROM wp_users WHERE ID = 7 LIMIT 1
SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 7
Quit