Ladezeiten, Datenbank Abfragen und Cachen

Die Ladezeiten von Blogs sind ein immer wiederkehrendes Thema. Klar ist das übel, wenn ein Blog elend lange braucht, um sich vollständig zu laden und nicht selten gibt es auch Probleme mit den Hostern wegen einem zu hohen Volumen von Datenbank Abfragen. Die verschiedensten Lösungswege sind zu finden, angefangen vom Deinstallieren von Performance Killer Plugins, über das Optimieren von Datenbanken, bis hin zum Cachen des gesamten Blogs oder einzelner Teile.

Besonders aufgefallen sind mir diesbezüglich in letzter Zeit die Beiträge von Thomas (ja sorry, ich weiß, lang lang ist es her) und auch der kürzlich erschienene Beitrag von Andreas über das Verkürzen der Ladezeiten. Das ein oder andere der Tipps in den beiden Beiträgen habe ich auch versucht, nur war ich dabei nicht ganz so erfolgreich. So funktioniert bei mir z.B. das Plugin Database Tuning aufgrund meiner MySQL Version nicht und auch andere Plugins haben so ihre Probleme.

Nun muss ich aber auch erwähnen, dass meine Ladezeiten generell eigentlich kein Problem darstellen und ich mich diesbezüglich auch eher halbherzig um dieses Thema gekümmert habe. Aktuell wurde es erst vorgestern, als ich in diesem Zuge von Thomas die Abfragemöglichkeit für die pro Seite genierten Datenbank Abfragen mit deren Zeiten bekam:

<!--<?php echo $wpdb->num_queries; ?> database queries in <?php timer_stop(1); ?> seconds -->

Kurzerhand habe ich diesen Code in meinen Footer integriert, Seite aufgerufen, Quelltext anzeigen lassen und… ich wäre beinahe rückwärts umgefallen, auf der Startseite über 150 Datenbank Abfragen, in einzelnen Beiträgen an/um die 180 Datenbank Abfragen.

Mit dieser Info ging der Spaß dann richtig los… und ist leider auch immer noch nicht so ganz beendet. An dieser Stelle erst einmal vielen Dank an meine fleißigen und unermüdlichen Helfer, Kim und Thomas. Ohne unseren regen eMail Austausch wäre ich in den letzten Tagen wohl kaum weiter gekommen! Herzlichen Dank Euch beiden für Eure Unterstützung. 8-)

Da meine Ladezeiten ja nun generell ziemlich gut waren, ging es bei mir nicht darum, irgendwelche Performance Killer zu entdecken und rauszuwerfen, sondern in erster Linie darum, die Anzahl der Datenbank Abfragen zu reduzieren. Anfangs versuchte ich es mit dem ein oder anderen Cache Plugin. Es widerstrebt mir aber z.B. den gesamten Blog zu cachen, wenn die Ladezeiten ja in Ordnung sind. Bei dem ein oder anderen Versuch kam dann das heraus, was man eigentlich vermuten würde, die Ladezeiten wurden durch generelle Cache Plugins eher verlängert als verkürzt. Ein Datenbank Cache Plugin war gleich noch viel besser unterwegs, denn es hat einzig und alleine meine Statistik Datenbank Abfragen gecached, mit dem Ergebnis, dass damit die Statistik total verfälscht wurde.

Nachdem ich dann gestern den ganzen Tag (!) auf der Suche war, hin und her probierte, stand ich am Ende des Tages, um einiges was nicht funktioniert schlauer, immer noch vor dem gleichen Problem. So baute ich kurzerhand an allen möglichen Stellen in meinem Theme den Abfrage Code oben ein und fing letztlich an, das Ganze in alle Einzelteile bezüglich Datenbank Abfragen zu zerlegen.

Dabei kam heraus, dass das Popular Posts Plugin in meiner Sidebar für seine 12 anzuzeigenden Beiträge ganze 25 Datenbank Abfragen braucht und meine Footer Verlinkung mit bereits reduzierten 32 Datenbank Abfragen zu Buche schlägt. Bereits reduziert, weil ich vom Plugin Recent Posts zur manuellen PHP Abfrage via WordPress Template Tags umgestiegen bin. Mit Recent Posts waren es um die 50 Datenbank Abfragen mehr.

Weitere viele Datenbank Abfragen Generierer vermute ich im Plugin Similar Posts und das Plugin Random Posts habe ich auch gleich mal deaktiviert. Rob Marsh, von dem alle diese Plugins sind, bietet auch ein Cache Plugin an… nur funktioniert das leider überhaupt nicht. Ergebnis: Nix, rein gar nichts wird gecached.

Nun ist es wohl so, dass der Großteil meiner Datenbank Abfragen aus der Verlinkung von Beiträgen stammt. Deswegen auf die Verlinkung von Beiträgen verzichten? Mitnichten! Sie ist in meinen Augen immer noch das Herzstück unserer Blogs.

Gerade diese Verlinkung von Beiträgen ändert sich nicht so häufig, als dass sie bei jedem Seitenaufruf neu generiert werden müsste. Es würde auch vollkommen ausreichen, sie z.B. 1x pro Tag neu zu generieren. Mit einem entsprechenden Cache würde somit die Gesamtlast der Datenbank Abfragen pro Tag speziell für diese Datenbank Abfragen auf ein Minimum reduziert werden und das Ganze würde wohl auch kaum auffallen.

Ein Plugin was genau ein solches macht, gibt es auch: WP Widget Cache. Nur leider funktioniert genau dieses Plugin nur für Widgets im Adminbereich (Design/Widgets) und kann nicht manuell z.B. in der sidebar.php oder in der footer.php eingefügt werden.

Da war guter Rat teuer! Ich bin heute im Laufe des Tages auf eine erfolgreiche Lösung via PHP gestoßen. Wie die funktioniert, erzähle ich Euch morgen, in einem zweiten Teil. Heute mag ich nicht mehr, denn ich saß auch heute schon wieder den ganzen Tag an diesem *Rotz* und bin auch immer noch nicht fertig damit. Nur soviel vorab: Meine gesamte Footer Verlinkung wird bereits gecached und erneuert sich momentan alle 12 Stunden. Ein paar entsprechende Hinweistexte sind in meinem Quelltext ebenfalls noch zu finden, für alle Neugierigen unter Euch.

Artikel vom: