Performance Probleme mit Advanced Custom Fields

Wir hatten gemerkt das unsere Webseite auf Grund von der Größe nicht mehr so performt wie erhoft und haben daher kurz vor dem Wochenende die Webseiten von einem „Shared-Webhosting“ Paket auf eine dediziert Server umgezogen. So ein dedizierter Server ist eine klasse Sachen. Man hat viel mehr Möglichkeiten, garantierten RAM von 4GB und muss sich um nichts kümmern. Der Umzug lief reibungslos und wir waren sehr zufrieden – bis zum Wochenenden…

Am Wochenende haben wir immer die meisten Zugriffen und so musste es ja kommen das der Webserver in die Knie ging. Keine Zugriffe mehr, was auf Grund der Einnahmen eine Mittelschwere Katastrophe ist. Der Techniker von HostEurope hatte das auch schon festgestellt und hielt es als erstes für einen Angriff, aber nein wir haben wirklich so viele Besucher. Trotz Caching und einer Erhöhung des RAMs auf 8GB war die Seite an diesem Wochenende nicht mehr zu retten. In den Gesprächen mit den Technikern hörten wir raus, dass man beim Shared-Webhosting bis zu 16 GB Ram hat, die man sich mit anderen teilt. Wir hatten wohl in der Vergangenheit Glück das wir diese 16 GB alleine nutzen konnte. Auf der anderen Seite, was haben wir für eine Webseite die über 8 GB Ram benötigt um 1000 Besucher zu bedienen?

Das Problem mit den Advanced Custom Field

Die Fehleranalyse hat recht schnell ergeben das wir ein Problem mit den Datenbankabfragen haben, da teilweise die Abfragen in Temp-Tabellen ausgelagert wurden. Da eine Datenbank bei Amazon mit 16 GB Ram auch keine Abhilfe geschafft hat, war schnell klar das neben der Datenbankabfragen auch die Verarbeitung in WordPress ein Problem auf Grund der Menge war.

Wenn man nun mal den verwendetet Code in WordPress unter die Lupe nimmt sieht das folgendermaßen aus:
$events = get_posts(array(
'post_type' => 'event',
'posts_per_page' => -1,
'meta_key' => 'stadt',
'meta_query' => array(
array(
'key' => 'datum',
'value' => get_the_ID(),
'compare' => '='
)
),
'orderby' => 'meta_value',
'order' => 'ASC'
));

Hier ist das Problem das wirklich alle Datensätze (Select * from…) abgefragt werden und dazu noch zwei Joins kommen. Hierdurch hat die Datenbank eine riesige Menge an Daten zurückgeben die auch noch vom PHP verarbeitet werden mussten.

Lösung für das Performance Problem

Um die Abfragen zu optimieren haben, wir sämtliche Abfragen neugeschrieben und wirklich nur die Daten angefordert, die wir auch benötigten. Für das Beispiel oben sieht das folgendermaßen aus:


$events = $wpdb->get_results("SELECT wpt.ID, wpt.post_title FROM wp_posts wpt
LEFT JOIN wp_postmeta m1 ON wpt.ID = m1.post_id
LEFT JOIN wp_postmeta m2 ON wpt.ID = m2.post_id
LEFT JOIN wp_posts m3 ON m1.meta_value = m3.ID
WHERE wpt.post_type = 'event'
AND (m1.meta_key = 'bundesland')
AND (m2.meta_key = 'datum' AND m2.meta_value = '".get_the_ID()."')
GROUP By wpt.ID
ORDER BY m3.post_title ASC, m1.meta_value ASC");

Durch eigene Abfragen konnte die Performance der Seite gesteigert werden und die Seite läuft wieder 🙂 Falls jemand ähnliche Erfahrungen machen konnte, freue ich mich auf Kommentare 🙂

0 Antworten

Hinterlassen Sie einen Kommentar

Wollen Sie an der Diskussion teilnehmen?
Feel free to contribute!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.