Warum ist Home (viel) langsamer als andere Seiten?

7

Ich versuche, eine WordPress-Website zu optimieren, die unter langsamen Ladezeiten leidet, und habe festgestellt, dass das Laden der Startseite anscheinend viel länger dauert. Es liegt nicht am Inhalt, da ich nur überlege, wie lange es dauert, bis die Basisanforderung endet (sichtbar über Firebug in Firefox).

Außerdem habe ich versucht, den index.php-Code in eine benutzerdefinierte Seite zu kopieren, und der gleiche exakte Code wird in ungefähr 1 Sekunde geladen, während das Haupt-Home in ungefähr 7 Sekunden geladen wird. Ich bemerkte, dass einzelne Seiten schneller geladen wurden, und zuerst dachte ich, dass dies daran lag der Unterschied im Inhalt, aber nach diesem Test bin ich nicht sicher, was dies verursacht.

Gibt es viel, was WordPress hinter den Kulissen nur für den Hauptindex macht? Gibt es eine andere Möglichkeit, diese Situation zu erklären und, was noch wichtiger ist, zu beheben, damit die Startseite schneller geladen wird?

UPDATE - SCHMUTZIGE LÖSUNG

Nach vielen blinden Versuchen habe ich eine neue Seite namens home erstellt, die index.phpals benutzerdefinierte Vorlage verwendet wird (keine Kopie, dieselbe Datei). Ich habe jeden Aufruf an den Basispfad umgeleitet (über das interne Umschreiben von WordPress) und habe dieselbe Homepage wie zuvor, die nur in 1/6 der Zeit geladen wurde. Obwohl ich mit dem Ergebnis zufrieden bin, würde ich gerne verstehen, was los ist.

EIN ANDERES UPDATE

Der Punkt scheint also zu sein, dass ich mit dieser Site keine dynamische Seite (im Sinne von WordPress) verwenden kann. Sie funktioniert nur mit einer benutzerdefinierten "statischen" Seite, auf der ich Inhalte über verschiedene Funktionen einfüge. Die normale Schleife macht das Home entweder sehr langsam (mit hohem Speicherlimit) oder einfach leer (niedriges Speicherlimit, Skript schlägt fehl).

Wie in dieser Frage vorgeschlagen , habe ich ein statisches Home erstellt, das mit einer benutzerdefinierten Seite verknüpft ist, und es funktioniert einwandfrei. Ich habe auch eine Blog-Seite erstellt (wieder mit einer benutzerdefinierten Vorlage), die ebenfalls einwandfrei funktioniert (wobei "gut" bedeutet, dass meine leere Testseite nur ein Wort und keinen Code enthält), es sei denn, ich gebe sie in admin -> als "Posts-Seite" an Einstellungen lesen. Mit anderen Worten, sobald WordPress eine dynamische Seite sieht (die die Hauptschleife enthalten soll), macht es etwas sehr Schweres, das viel RAM auffrisst.

Ich suche immer noch nach der Ursache dafür, kann es aber umgehen, aber ich würde wirklich gerne verstehen, wo das Problem liegt.

Bearbeiten: Kopfgeld hinzugefügt

Weitere Informationen: Ich habe versucht, alle Plugins zu deaktivieren. WordPress wurde auf die neueste Version aktualisiert.

WEITERE BEARBEITUNG: TABELLENINDEXE

wp_posts:

PRIMARY KEY  (`ID`),
KEY `type_status_date` (`post_type`,`post_status`(1),`post_date`,`ID`),
KEY `post_status_date_gmt` (`post_status`(1),`post_date_gmt`),
KEY `post_date` (`post_date`),
KEY `post_date_gmt` (`post_date_gmt`),
KEY `post_parent` (`post_parent`),
KEY `post_name` (`post_name`),
KEY `post_status` (`post_status`),
KEY `post_author` (`post_author`),
FULLTEXT KEY `post_related` (`post_name`,`post_content`),
FULLTEXT KEY `post_content` (`post_content`,`post_title`),

wp_term_relationships:

PRIMARY KEY  (`object_id`,`term_taxonomy_id`),
KEY `term_taxonomy_id` (`term_taxonomy_id`)

wp_term_taxonomy:

PRIMARY KEY  (`term_taxonomy_id`),
UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`),
KEY `taxonomy` (`taxonomy`)
Matteo Riva
quelle
@kemp - Sofern ich es nicht vermisse, haben Sie keinen Link zur Startseite eingefügt, damit wir es selbst sehen können. Können Sie das tun?
MikeSchinkel
1
Fügen Sie Ihrer Website außerdem die folgenden Profilerstellungstools hinzu: wordpress.stackexchange.com/questions/1567/…, damit http://example.com?debug=sql
Folgendes
@Denis hat das versucht, scheint keine Ausgabe zu bekommen. Ich erhalte eine leere Seite und den gelegentlichen internen Serverfehler mit dieser Meldung im Protokoll:Premature end of script headers: index.php
Matteo Riva
@kemp hast du den Cache-Inhalt gelöscht und die Tests mit 2 identischen Seiten (dynamisch / statisch) wiederholt?
Edelwasser
Duh, ich habe gerade bemerkt, dass Ihre URLs eine ausführliche Permalink-Struktur verwenden. Was passiert, wenn Sie eine der vorgeschlagenen datums- / namensbasierten Strukturen verwenden, z. B. / JJJJ / MM / slug /?
Denis de Bernardy

Antworten:

8

Ich möchte mich von den beiden vorhergehenden Kommentaren unterscheiden.

Die Verwendung einer statischen Homepage führt dazu, dass WP einen Index-Scan für den Primärschlüssel der Posts-Tabelle verwendet, während ein (ach so gelegentlicher) Index-Scan für post_date, status oder post_parent in der Posts-Tabelle verwendet wird.

Im Wesentlichen ist die Homepage aufgrund des schlechten Datenbankdesigns in WP absolut langsam. Das Schema enthält lächerliche mehrspaltige Indizes für die Taxonomietabellen, die MySQL einfach ignoriert, sobald Sie eine sinnvolle Anzahl von Posts haben. Die Tatsache, dass wir eine Tabelle zu oft für Taxonomien verwenden, hilft auch nicht weiter.

Fügen Sie in der Datenbank sicher Indizes hinzu für:

CREATE INDEX extra_posts ON posts (post_type,post_status,post_date DESC)
CREATE INDEX extra_term_rel ON term_relationships(term_taxonomy_id,object_id)
CREATE INDEX extra_term_tax ON term_taxonomy(taxonomy,term_taxonomy_id,term_id)

Es wird nicht perfekt sein, aber zumindest kann WP indexbasierte Pläne für verschachtelte Schleifen auf Ihrer Startseite verwenden ...

Oh, und ... wenn Sie auf Ihrer Startseite einen benutzerdefinierten Beitragstyp verwenden, müssen Sie außerdem Folgendes hinzufügen:

posts(post_status,post_date DESC)

Andernfalls wird aufgrund der OR-Klauseln überhaupt kein Index für die Hauptabfrage verwendet.

Denis de Bernardy
quelle
@Denis können Sie bitte die Indizes überprüfen? Ich habe die Frage aktualisiert, da sie nicht in einen Kommentar passen würden. Können 13.200 Beiträge auch als zu viele angesehen werden? Was aus meiner Sicht auch seltsam ist, ist, dass die normale Schleife in Kategorieseiten einwandfrei funktioniert.
Matteo Riva
13200 Zeilen in einer Datenbank sind nur sehr wenige, es sei denn, sie werden schlecht abgefragt. Meine Entwickler-Site mit ein paar ungeraden Posts liest die gesamte Diskettenseite und sortiert das Ergebnis in kürzester Zeit. Im Gegensatz dazu hat meine Live-Site etwas mehr als 1000 Beiträge und PHP benötigt in der Größenordnung von 50 ms, um die Beiträge der Titelseite abzurufen. Um dies ins rechte Licht zu rücken, zieht meine PgSQL-Entwickler-Site in 20 ms die Top-10-Zeilen aus ein paar Hunderttausenden heraus ...
Denis de Bernardy
Zu Ihren aktuellen Indizes: type_status_date ist so breit, dass MySQL normalerweise lieber post_status oder post_date verwendet. post_status_date_gmt / post_date_gmt werden intern für sehr spezifische Abfragen verwendet. Normalerweise der erste meiner Erfahrung. post_parent / post_name werden bei der Abfrage hierarchischer Typen verwendet. Der erste würde davon profitieren, wenn der post_type vorangestellt wäre, um Stammseiten schnell abzurufen. post_author ist nützlich für Autorenseiten und im Admin-Bereich. Für die Autorenseiten des Frontends wäre dies idealer: (post_author, post_type, post_status, post_date DESC).
Denis de Bernardy
Weiter ... term_tax (object_id, term_taxonomy_id) ist gut, um Tags / Katzen / etc von Posts zu erhalten. Zuletzt habe ich überprüft, dass keiner der anderen Indizes zu Begriffen verwendet wird. Mit meiner oben erwähnten extra_term_tax können die Begriffe tatsächlich mithilfe eines Index abgerufen werden, und mit extra_term_rel können Beiträge abgerufen werden, die mit einem Begriff übereinstimmen.
Denis de Bernardy
@Denis - tolle Antwort hier ... Ich wollte Sie nur fragen, ob Ihre vorgeschlagene Lösung für sein Problem etwas ist, das Sie standardmäßig auf Ihren WordPress-Sites implementieren?
NetConstructor.com
5

Standardmäßig gibt es keinen Unterschied für die Leistung der Homepage. Es besteht jedoch die Möglichkeit, dass ein Plugin nur auf dieser Seite etwas Langsames tut.

Es gibt viele Plugins, um die WP-Leistung zu profilieren. Normalerweise verwende ich WP Tuner, aber es scheint für die neueste WP-Version defekt zu sein, daher kann ich keinen sofortigen Ersatz vorschlagen.

Am einfachsten ist es, eine Vorlage voller Zeit- / Speichermarkierungen zu packen.

printf(  '%d queries in %.3f seconds, using %.2fMB memory', get_num_queries(), timer_stop( 0, 3 ), memory_get_peak_usage() / 1024 / 1024 );

Es ist grob, erlaubt aber oft, den Ort zu bestimmen, an dem eine Verlangsamung auftritt.

Selten
quelle
Rarst hat recht. Sie haben wahrscheinlich ein Plugin oder Widget, das nur auf der Homepage ausgeführt wird und lange Fragen zu etwas stellt (z. B. nach einer Kategorie oder etwas
suchen
@Jeremy: aber das erklärt nicht, warum eine exakte Kopie des Hauses unter einem anderen Seitennamen schneller geladen wird.
Matteo Riva
@Rarst: Danke für den Vorschlag, aber ich kann nicht scheinen, dass es richtig funktioniert. Ich sehe den Bericht auf der Administrationsseite, aber nichts auf den regulären. Könnte von der Tatsache abhängen, dass WordPress mit vbulletin überbrückt ist und das Plugin mich nicht als angemeldeten Administrator erkennt
Matteo Riva
1
Es kann ein exakter Code des Seitencodes sein, aber es ist keine exakte Kopie der Umgebung. Bedingte Tags sind eine sehr grundlegende WordPress-Codetechnik - Homepage und reguläre Seite können im Code identisch sein, aber bedingte Tags geben unterschiedliche Werte zurück, sodass möglicherweise unterschiedlicher Code auf Hooks ausgelöst wird. | Funktioniert nicht - du meinst Plugin oder Snippet?
Erster
2
Kemp: Deaktivieren Sie alle Plugins und prüfen Sie, ob der Unterschied noch besteht. Wenn es weg ist, aktivieren Sie sie einzeln. Eine andere Möglichkeit, dies zu testen, besteht darin, eine brandneue Site ohne Plugins zu installieren und Ihr Thema darauf auszuführen. Überprüfen Sie, ob die Startseite noch länger dauert.
Jerclarke
3

Nach fast 4 Jahren kam ich wieder darauf zurück und fand schließlich das Problem. Es stellte sich heraus, dass die Website viele Artikel enthielt, die ALLE als klebrig markiert waren. Aufgrund der unglaublich dummen Art und Weise, wie WordPress klebrige Posts markiert (ein serialisiertes Array in wp_options), dauerte die Hauptschleife der dynamischen Homepage unglaublich lange. Das Löschen des sticky_postsFeldes in der Tabelle hat das Problem behoben.

Matteo Riva
quelle
0

Wenn das Laden der Homepage so lange dauert, haben Sie höchstwahrscheinlich ein Plugin oder eine Funktion im Design, die beim Rendern der Homepage eine Remote-Anfrage stellt.

Ich würde eine rekursive Suche in Ihrem wp-content-Verzeichnis nach Aufrufen von 'wp_remote_' durchführen, um nach Funktionen zu suchen, die dies verursachen könnten.

Prettyboymp
quelle
Es muss etwas sein, was WordPress vor dem Laden der Vorlage tut , da es nicht am Code der Seite liegt.
Matteo Riva
2
Der Code befindet sich möglicherweise nicht auf der Seite selbst, sondern funktioniert wie wp_head()Aufruf-Aktions-Hooks, mit denen Plug-Ins sekundäre Funktionen aufrufen können. Aus diesem Grund schlug @prettyboymp eine Suche im gesamten wp-contentVerzeichnis vor und @Jeremy Clarke empfahl, alle oben genannten Plug-Ins zu deaktivieren.
EAMann
Ja, aber die gleiche Seite funktioniert einwandfrei als "statisch" bezeichnet. Sie hängt nur, wenn sie als "dynamisch" bezeichnet wird.
Matteo Riva
0

Überprüfen Sie zunächst die Anforderungen von WOrdPress und die enthaltenen Bilder, Skripte und Stylesheets. Sie können die Abfragen mit den Plugin- Debug-Abfragen überprüfen und erhalten weitere Informationen zu Ihrer Installation und zu Fehlern mit den Plugin- Debug-Objekten .

bueltge
quelle