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:
get_transient()
0,0245 Sekundenget_option()
0,0068 Sekunden- einfache Auswahloperation aus der benutzerdefinierten Tabelle 0,65 Sekunden
Ich habe auch überprüft, dass der Übergang während dieses Tests nicht abgelaufen ist. Die Frage ist also, ist get_option()
schneller als get_transient()
oder habe ich etwas in meinem Test durcheinander gebracht? Ist die Verzögerung der benutzerdefinierten Tabelle darauf zurückzuführen, dass Optionen standardmäßig von WordPress zwischengespeichert werden? Werden Optionen auch von verschiedenen Caching-Plugins wie den Transienten zwischengespeichert?
quelle
Antworten:
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
Dies ist auch ein unfairer Vergleich. Optionen mit dem
autoload
Optionssatz werden in einer einzigen Abfrage frühzeitig in Advanced geladen. Wirdget_option
also von gezogenWP_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 abgerufenDies 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.
Es hängt davon ab, ob:
get_option
Anrufautoload
Wert true werden zu Beginn alle in einem einzigen Aufruf geladen, sodass sie im Speicher bleiben. Danach werden keine Abfragen mehr ausgeführtSehr gut möglich, aber wie schnell diese Auswahl dauert, hängt stark von der Abfrage und dem Tabellendesign ab
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:
WP_Cache
, die normalerweise nicht vorhanden sind. ZBWP_Post
Objekte, Post-Meta usw.WP_Cache
bleibt nun über Anfragen hinweg bestehenTransienten 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
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 uswWas 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
quelle
Wenn kein Objekt - Caching gefunden wird,
get_transient
ruftget_option
zweimal, einmal oder das Ablaufintervall und ein für den Wert, dafür ist es nicht schneller sein wird.get_option
Die Leistung selbst wird davon beeinflusst, ob die Option "automatisch geladen" ist (Standard) oder nicht. Alle automatisch geladenen Optionen werden in einer Anforderung für die Datenbank abgerufen und im Speichercache gespeichert. Daher sollte es nur sehr geringe Auswirkungen darauf haben, wie oft Sie aufrufen,get_option
selbst wenn es sich um verschiedene Optionen handelt.Wenn Sie direkt auf die Datenbank zugreifen, umgehen Sie alle Caching- und anderen Leistungsverbesserungen. Es wird erwartet, dass diese langsamer sind, es sei denn, Sie implementieren selbst eine intelligente Logik.
Trotzdem bin ich mir nicht sicher, ob Ihr Test gut war, aber unabhängig davon ist die gesamte Diskussion sinnlos, als ob Sie sich wirklich für die Leistung interessieren. Sie werden ein Objekt-Cache-System (und das entsprechende Plugin) verwenden, das die Datenzugriffszeit viel näher bringt auf Null ... und wenn Sie sich entscheiden, Ihre eigenen DB-Tabellen zu verwenden, sollten Sie natürlich Ihre Zugriffs-APIs in den Objekt-Caching-Mechanismus integrieren.
quelle