Heute führe ich einen Test über meine Datenbank durch, um den Geschwindigkeitsunterschied zwischen dem Zugriff auf einen Schlüssel über Optionen, benutzerdefinierte Tabellen und Transienten zu untersuchen. Ich habe den Test 1000 Mal ausgeführt und es folgt die Zeit, die benötigt wird, um 1000 get-Operationen auszuführen:
Beachten Sie, dass die Optionstabelle auf den meisten Systemen sowohl für Optionen als auch für Transienten verwendet wird und diese Tabelle mit hinzugefügten Indizes optimiert wurde. Es ist also kein fairer Vergleich
get_transient () 0,0245 Sekunden get_option () 0,0068 Sekunden einfache Auswahloperation aus der benutzerdefinierten Tabelle 0,65 Sekunden
Dies ist auch ein unfairer Vergleich. Optionen mit dem autoload
Optionssatz werden in einer einzigen Abfrage frühzeitig in Advanced geladen. Wird get_option
also von gezogen WP_Cache
, wurde die Option bereits abgerufen.
TLDR: Die Option wird nicht abgerufen, sondern bereits abgerufen. Aufgrund der autoload
Option wird sie nur aus dem Speicher abgerufen
Ich habe auch überprüft, dass der Übergang während dieses Tests nicht abgelaufen ist.
Dies sollte sich nicht auf ein normales System beim vorübergehenden Abrufen auswirken, schließlich weiß es nicht, ob es abgelaufen ist, bis es abgerufen wurde.
Die Frage ist also, ist get_option () schneller als get_transient () oder habe ich in meinem Test etwas durcheinander gebracht?
Es hängt davon ab, ob:
- Auf den meisten Systemen werden Transienten mithilfe von Optionen gespeichert. Beide beinhalten einen
get_option
Anruf
- Optionen mit dem
autoload
Wert true werden zu Beginn alle in einem einzigen Aufruf geladen, sodass sie im Speicher bleiben. Danach werden keine Abfragen mehr ausgeführt
- Durch das Zwischenspeichern von Objekten werden sowohl automatisch geladene Optionen als auch Transienten zwischengespeichert
Ist die Verzögerung der benutzerdefinierten Tabelle darauf zurückzuführen, dass Optionen standardmäßig von WordPress zwischengespeichert werden?
Sehr gut möglich, aber wie schnell diese Auswahl dauert, hängt stark von der Abfrage und dem Tabellendesign ab
Werden Optionen auch von verschiedenen Caching-Plugins wie den Transienten zwischengespeichert?
Ja, WP_Cache
wird verwendet, wodurch es für den Rest der Anforderung im Speicher gespeichert wird. Caching-Plugins können diese Werte aus Leistungsgründen beibehalten.
Wiederholbarkeit
Diese werden alle über zwischengespeichert, WP_Cache
sodass beim zweiten Anfordern keine Datenbank beteiligt ist.
Variabilität und es kommt darauf an
Dies alles setzt eine gemeinsame Basis voraus, aber was ist mit Objekt-Caches?
Lassen Sie uns eine MemcacheD-Instanz oder eine Redis-Instanz einführen (ich empfehle Ihnen dringend, dies zu tun, wenn Sie die Option haben, RIESIGE Leistungsvorteile für gut erstellte Websites, insbesondere wenn Sie sie für das Zwischenspeichern von Seiten verwenden, es sei denn, Sie haben so etwas wie ein Lack-Setup).
Jetzt haben wir eine neue Situation:
- Jetzt werden Daten im RAM gespeichert, und sobald sie aus der Datenbank abgerufen wurden, werden sie vorbereitet und die Zugriffszeiten werden drastisch reduziert. Immer noch langsamer als eine Variable, aber deutlich schneller als eine Datenbankabfrage
- Es werden viele neue Daten gespeichert
WP_Cache
, die normalerweise nicht vorhanden sind. ZB WP_Post
Objekte, Post-Meta usw.
WP_Cache
bleibt nun über Anfragen hinweg bestehen
- MemcacheD usw. können abgelaufene Transienten usw. Beseitigen
Transienten und Optionen haben jetzt die gleichen Zugriffskosten. Sie waren bereits in der Nähe, aber sie sind jetzt vernachlässigbar und haben mehr mit der CPU-Auslastung zum Zeitpunkt der Anforderung zu tun.
Sollte ich für die Leistung Transienten oder Optionen verwenden?
Die Frage ist zwar eine würdige Frage, aber die Antwort lautet, dass der Unterschied vernachlässigbar ist und innerhalb der Fehlergrenzen liegt
Stoppen Sie also die Mikrooptimierung, sie sind das gleiche Speichermedium, und dies ist Ihre Zeit nicht wert
- Verwenden Sie Optionen, wenn Sie etwas speichern müssen, das sich auf der gesamten Website befindet
- Verwenden Sie Transienten, um vorübergehend Dinge zu speichern, deren Berechnung teuer ist, damit Sie das nächste Mal nicht müssen
Es lohnt sich nicht, je nach Leistung einen über den anderen zu wählen. Es gibt keinen bedeutenden Unterschied.
Es gibt weitaus bessere Optimierungsmöglichkeiten, die zu erheblich größeren Einsparungen führen, z. B. die Verwendung von Taxonomien anstelle von Meta in Post-Abfragen, die Verwendung von __not
Stilparametern, die Ausführung weniger Dinge auf der Seite, die Installation eines Objektcaches, geringere Posts pro Seite und die Vermeidung von Remote-Anforderungen usw
Was ist mit einer benutzerdefinierten Tabelle, die ...
Nein, die Optionstabelle ist bereits gut optimiert. Wenn Sie eine benutzerdefinierte Tabelle verwenden, werden Vorgänge einfach außerhalb des WP-Caching-Systems verschoben, sodass Sie gezwungen sind, Ihre eigenen zu schreiben