Ich arbeite an einer Website für ein Unternehmen, das höchstwahrscheinlich Millionen von Posts über einen benutzerdefinierten Post-Typ erstellen wird. Es sind Gebete, also gibt der Benutzer am Frontend einfach eine kurze Phrase über ein Formular ein. Alles, was das Unternehmen interessiert, ist der Inhalt des Beitrags und das Datum der Veröffentlichung. Die Seite ist noch nicht einmal online und sie hat bereits über 120.000 Posts, also meine ich es ernst, wenn ich Millionen sage.
Also, ein paar Optimierungsfragen:
- Nehmen wir an, ich habe eine Kategorie, die in einem benutzerdefinierten Beitragstyp mit 500.000 Beiträgen 'vorkommt'. Die vorgestellte Kategorie hat nur 500 Beiträge. Wenn ich eine Abfrage für die vorgestellten Posts erstelle, frage ich dann die gesamten 500.000 Posts oder nur die 500 vorgestellten Posts ab? Was ist, wenn ich nur die zehn neuesten Posts anzeigen möchte, die vorgestellt werden?
- Wenn ich diesen benutzerdefinierten Beitragstyp in der Datenbank speichere, kann ich dann noch etwas tun, um Serverressourcen zu sparen, zumal der Inhalt des Beitrags und das Datum das einzige sind, was wirklich benötigt wird?
- Sollte ich überhaupt einen benutzerdefinierten Beitragstyp verwenden? Ich mag es im Prinzip, weil es gut in den WordPress-Admin integriert ist, aber wenn es signifikante Performance-Nachteile gibt, kann ich wahrscheinlich etwas anderes machen.
Ich habe noch nie an einem Projekt in dieser Größenordnung gearbeitet, daher ist mir die Leistung ein bisschen wichtiger als gewöhnlich. Danke für jede Hilfe!
query
optimization
Jeremiah Prummer
quelle
quelle
Antworten:
1. Legen Sie die Abfrage fest, bevor WP_Query ausgeführt wird
Dies scheint das Wichtigste zu sein, das Sie beachten sollten, wenn Sie versuchen, Datenbankabfragen auf ein Minimum zu beschränken, da die Abfrage nur geändert werden kann, bevor sie in der SQL-Datenbank ausgeführt wird.
Normale Abfragen
Für eine normale Abfrage verwendet WordPress die
wp()
Funktion, die wiederum aufruft$wp->main( $query_vars )
. Die "is_-Variablen" aus bedingten Tags werden vor der Übergabe festgelegtWP_Query->get_posts()
, wodurch sie in eine MySQL-Datenbankabfrage konvertiert und schließlich im $ wp_query-Objekt gespeichert werden. Es ist möglich, die Abfrage zu filtern, bevor sie tatsächlich in der SQL-Datenbank ausgeführt wird .Die
pre_get_posts
Aktion greift in diesen Prozess ein und ermöglicht es Ihnen, die Abfrage zu ändern, bevor sie an übergeben wirdWP_Query->get_posts()
.Wenn Sie beispielsweise die Abfrage nach Beiträgen in der Kategorie "Hervorgehoben" filtern möchten, verwenden Sie
add_action( 'pre_get_posts', 'your_function_name' );
dasin_category
bedingte Tag und schließen es in dieses einyour_function_name
.Siehe Plugin-API / Aktionsreferenz / Vorabrufen von Beiträgen «WordPress Codex
Seite Requests
Was Seitenvorlagen, wie die Archivseite für die „vorgestellten “ -Kategorie, bedingte Tags werden nicht funktionieren , aus dem
pre_get_posts
Filter. Sie können beispielsweise nichtis_category
zum Überprüfen der Archivseite verwenden, da WP_Query nicht ausgeführt wurde.Stattdessen müssten Sie die Hauptabfrage für Seitenanfragen mit einer ändern, die ungefähr
new WP_Query
so aussieht$query = new WP_Query( 'cat=123' );
. Dadurch wird die Abfrage von Anfang an mit dem entsprechenden Argument ausgeführt.Siehe Klassenreferenz / WP-Abfrage «WordPress-Codex
2. In der Datenbank speichern
Sie können den Filter verwenden, um
wp_insert_post_data
sicherzustellen, dass nur die für Ihren benutzerdefinierten Beitragstyp relevanten $ -Daten an zurückgegeben werdenwp_insert_post
. Stellen Sie sicher, dass Sie eine bedingte Anweisung einschließen, um Ihren benutzerdefinierten Beitragstyp zu überprüfen.Plugin API / Filter Reference / WP Post-Daten einfügen «WordPress Codex
Dieser Hook wird von der
wp_insert_post
Funktion aufgerufen, die von wp_update_post aufgerufen wird, wenn Sie Ihren benutzerdefinierten Beitragstyp aktualisieren, normalerweise durch Speichern eines Entwurfs oder Veröffentlichen des Beitrags.Sie müssen es jedoch selbst bewerten, da ich nicht persönlich über die Optimierungsbedeutung der Reduzierung der in der Datenbank aktualisierten Daten sprechen kann.
3. Beeinträchtigen benutzerdefinierte Beitragstypen die Leistung?
Nach meiner Erfahrung sind benutzerdefinierte Beitragstypen ein leistungsstarkes Tool für die Verwaltung von Inhalten. Ich kenne keine andere Möglichkeit, Beiträge so zu verwalten, dass weniger Ressourcen verbraucht werden. Ich würde mich persönlich darauf konzentrieren, Wege zu finden, um die Anzahl der gestellten Anfragen zu verringern, wo immer dies möglich ist.
Früher gab es ein Leistungsproblem im Zusammenhang mit der Permalink-Struktur, das einen Treffer verursachte, wenn mit Text anstelle einer Zahl begonnen wurde. 3 Dies war besonders für Websites mit einer großen Anzahl von Seiten problematisch, wurde jedoch seit WordPress Version 3.3 behoben.
Ich rufe hier nur Permalinks auf, weil der Slug normalerweise der erste Teil der Permalink-Struktur ist, der die Leistung vor Version 3.3 möglicherweise beeinträchtigt hat oder nicht. Abgesehen davon sind mir keine Leistungsprobleme bekannt, die sich aus der Verwendung benutzerdefinierter Beitragstypen ergeben.
Andere Leistungsoptionen
Transienten
Dies ist kein Ersatz, um Abfragen in Ihrem Code auf ein Minimum zu beschränken. Sie können jedoch set_transient verwenden , um die Abfragen für einige Zeit zu speichern, sodass keine neuen Abfragen erforderlich sind. Hier ist das Beispiel, das in Dave Clements 'Post verwendet wird . Beachten Sie auch, dass er empfiehlt, eine
save_post
Aktion hinzuzufügen , um den Übergang jedes Mal zu löschen, wenn ein bestimmter Beitragstyp aktualisiert wird.Weitere Optimierung von Abfragen
Thomas Griffin hat einige gute Tipps in seinem Tutorial zur Optimierung von WordPress-Abfragen . Hier ist eine kurze Liste seiner Vorschläge:
In
'cache_results' => false
einmaligen Abfragen festlegen, wenn Ihr Server kein persistentes Caching wie Memcached verwendet. Einmalige Abfragen werden als "Abfragen" bezeichnet, die zum Anzeigen kleiner Datenmengen verwendet werden. Möglicherweise möchten Sie nur verknüpfte Beitragstitel für den aktuellen Beitrag anzeigen, oder Sie möchten eine Dropdown-Liste der Beiträge anzeigen, für die Sie auswählen können eine bestimmte Optionseinstellung. "Sein Beispiel:
$query = get_posts( array( 'posts_per_page' => 1, 'cache_results' => false ) );
Stellen Sie ein,
'no_found_rows' => true
wo keine Paginierung erforderlich ist. Dadurch wird "MySQL umgangen, indem die Ergebnisse gezählt werden, um festzustellen, ob eine Paginierung erforderlich ist oder nicht".Sein Beispiel:
$query = new WP_Query( array( 'posts_per_page' => 1, 'no_found_rows' => true ) );
Abfrage für Post - IDs nur , wenn dies alles , was Sie brauchen
'fields' => 'ids'
inget_posts
. Dies sollte die Menge der zurückgegebenen Daten erheblich reduzieren, was pro Post ziemlich viel ist, wenn man sich die Datenbankbeschreibung «WordPress Codex» ansiehtSein Beispiel:
$query = get_posts( array( 'posts_per_page' => 1, 'fields' => 'ids' ) );
Zusätzlich zu diesem letzten Tipp kann dieselbe Argumentation angewendet werden, wenn Sie mit get_post_field nur ein oder mehrere Post-Felder benötigen .
Ein solides Verständnis der Funktionsweise der Abfrage ist von wesentlicher Bedeutung. Je genauer Sie mit Ihren Abfragen umgehen können, desto weniger Arbeit wird von Ihrer SQL-Datenbank verlangt. Dies bedeutet, dass es eine Vielzahl von Möglichkeiten gibt, Datenbankabfragen zu verwalten. Seien Sie vorsichtig mit benutzerdefinierten Abfragen, sofern diese ausgeführt werden (handelt es sich um eine Administrationsseite?), Verwenden Sie bei direkten Abfragen die ordnungsgemäße Bereinigung und versuchen Sie, native WordPress-Funktionen zu verwenden, mit denen Sie die gleiche Leistung erzielen.
quelle
Ich füge auch hinzu:
Bitte besuchen Sie: https://drujoopress.wordpress.com/2013/06/27/how-to-optimize-wordpress-query-to-get-results-faster/#more-184
quelle
Wie alle vorzeitigen Optimierungsfragen kann diese nicht wirklich beantwortet werden, ohne die genauen Verwendungsmuster zu kennen, die zu oft erst beim Start entdeckt werden.
Generell sollte es laut MYSQL-Spezifikation keine Probleme mit der Datenmenge geben. Natürlich ist das Durchsuchen von Daten selbst mit den besten Algorithmen langsamer als mit viel kleineren Tabellen, aber die Lösung dafür ist eine einfache, stärkere CPU.
Möglicherweise möchten Sie optimieren, wie Metadaten gespeichert werden (z. B. um keine Ping-bezogenen Daten zu speichern), aber dies hängt davon ab, was Sie genau tun. Letztendlich benötigen Sie möglicherweise noch eine stärkere CPU, sodass sich Ihre Mühe möglicherweise nicht lohnt .
quelle