Wenn Ihr Plugin VIELE Daten enthalten soll, ist die Verwendung von wp_postmeta
KEINE gute Idee, wie unten gezeigt:
Beispiel WooCommerce: In einem Geschäft mit ca. 30.000 Produkten gibt es durchschnittlich ca. 40 Post-Meta (Attribute und alles) pro Produkt, also 5 Produktbilder pro Produkt, was ca. 4 Bild-Meta bedeutet für jedes Bild:
30.000 Produkte x 40 Meta je = 1.200.000 Zeilen in wp_postmeta
+
30.000 Produkte x 5 Bilder je x 4 Bildmeta für jeweils = 600.000 Zeilen in wp_postmeta
Also mit nur 30.000 Produkte betrachten Sie mit 1.800.000 Zeilen wp_postmeta
.
Wenn Sie Ihren Produkten oder Produktabbildungen weitere Eigenschaften hinzufügen, multipliziert sich diese Zahl.
Das Problem dabei ist zweierlei:
- Self-Joins sind mit MySQL sehr teuer
wp_postmeta
Die Tabelle wird nur indiziert, wenn Sie neuere MySQL-Versionen verwenden (dh kein FULLTEXT-Index für meta_value
).
Um ein Beispiel aus einem konkreten Fall zu geben:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
Dadurch wird die Versandstadt aus allen Bestelldetails mit einem Zeitsprung von ~ 3 Sekunden auf einem dedizierten Einstiegsserver ausgewählt, selbst wenn es 5-10 Bestellungen gibt . Dies liegt daran, dass die Abfrage in einer wp_postmeta
Tabelle ausgeführt wird, die in der Live-Installation ~ 3 Millionen Zeilen enthält.
Sogar die Homepage ist ziemlich langsam, da das Thema verschiedene Elemente aus wp_postmeta
- Schiebereglern, ein paar Review-Einfügungen, ein paar anderen Metaelementen herausholt. Im Allgemeinen ist die Auflistung von Produkten sehr langsam, und die Suche bei der Auflistung von Produkten ist ähnlich langsam.
Sie können dies nicht auf normale Weise beheben. Sie können Elastic Search in Ihren Server einfügen und ein Elastic Search-Plugin in Wordpress verwenden, Sie können Redis / Memcached verwenden, Sie können ein gutes Seiten-Cache-Plugin verwenden, aber am Ende bleibt das grundlegende Problem bestehen - das Abrufen einer beliebigen Datenmenge von einem aufgeblähten Computer wp_postmeta
Der Tisch wird langsam sein, wann immer er fertig ist. Auf dem Server, auf dem ich die unten implementierte Lösung getestet habe, wurden alle diese Komponenten ordnungsgemäß installiert und konfiguriert und optimiert, und die Website funktionierte für nicht angemeldete Benutzer oder häufig gestellte Fragen einwandfrei, seit das Caching von Plugins aktiviert wurde.
Aber in dem Moment, in dem ein angemeldeter Benutzer versuchte, etwas zu tun, was normalerweise nicht erledigt wurde, oder die Cron-, Caching-Plug-ins oder andere Dienstprogramme die tatsächlichen Daten aus der Datenbank abrufen wollten, um sie zwischenzuspeichern oder etwas anderes zu tun, wurden die Dinge langsam.
Also habe ich etwas anderes ausprobiert:
Ich habe ein kleines Plugin codiert, um alle Produkt-Metas (Postmetas für Post-Type- Produkte ) in eine benutzerdefinierte Tabelle zu übertragen, die durch Code generiert wurde. Dieses Plugin hat alle Metas für jeden Beitrag verwendet und eine Tabelle erstellt, indem jedes Meta als Spalten hinzugefügt und die Werte in jede Zeile eingefügt wurden. Ich habe das EAV-Format in ein horizontales, flaches relationales Format umgewandelt. Ich hatte auch das Plugin, um Postmeta von allen verschobenen Produkten aus der wp_postmeta
Tabelle zu löschen .
Während ich dabei bin, habe ich Postmeta für Anhänge und alle Metas anderer Posttypen in ihre eigenen Tabellen verschoben .
Dann habe ich den get_(post_type)_meta
Filter aktiviert, um das Abrufen von Metadaten aus neuen benutzerdefinierten Tabellen zu überschreiben.
Nun dauert der Abruf derselben Abfrage von früher, für den ~ 3 Sekunden wp_postmeta
benötigt wurden, ~ 0,006 Sekunden. Die Site verhält sich jetzt so, als wäre es eine neue WP-Installation.
....................
Natürlich ist es besser, Dinge mit Wordpress zu tun. Das ist eigentlich die Norm.
Allerdings ist es auch offensichtlich , dass Wissen EAV - Tabelle in Skalierung sehr ineffizient ist. Es ist unendlich flexibel und lässt Sie alle Daten speichern, aber der Preis, den Sie dafür bezahlen, ist die Leistung. Es ist ein grundlegender Kompromiss.
In diesem Zusammenhang ist es schwierig, jemandem mitzuteilen, der beabsichtigt, eine Menge Daten zu haben, und - Gott bewahre - diese Daten abzufragen / zu durchsuchen, um die wp_postmeta
Tabelle sicher zu verwenden. Der Leistungstreffer wird großartig sein.
Durch die Verwendung Ihrer benutzerdefinierten Tabellen können sich Ihre Daten häufen und bleiben dennoch schnell genug.
Genau wie Pippin Williams, der Schöpfer des Easy Digital Downloads-Plugins, erwähnt hat, dass er benutzerdefinierte Tabellen verwenden würde, wenn er gerade mit dem Codieren seines Plugins beginnen würde, wenn Sie etwas erstellen möchten, das für lange Zeit verwendet wird, oder wenn Sie eine Menge Daten stapeln möchten. Es ist effizienter, Ihre benutzerdefinierten Tabellen zu verwenden, wenn Sie sie gut entwerfen.
Sie müssen sicherstellen, dass sich jeder andere Plugin / Addon-Entwickler in Ihr Plugin einbinden kann, um Ihre Daten vor und nach dem Abrufen der Daten zu manipulieren. Wenn Sie das tun, dann sind Sie ziemlich solide.