Ein bisschen spät, um dies zu beantworten, aber da es für die relevante Suche ansteht, wird dies für jemanden von Nutzen sein:
WordPress verwendet das EAV-Datenbankschema für einen Teil seiner Datenbankimplementierung. Dies betrifft sowohl die Daten als auch die Benutzer. (Sie werden in separaten Tabellen aufbewahrt)
Um es aus Datenwinkel zu erklären:
Zusammen mit den direkt zugänglichen postbezogenen Details in wp_posts werden für jeden Beitrag zahlreiche Metas in der Tabelle wp_postmeta veröffentlicht. Alle Daten, die für den Beitrag (oder den benutzerdefinierten Beitragstyp) relevant sind.
Das Problem dabei ist, dass es bei HEAPS von Posts oder Seiten (oder benutzerdefinierten Posts / Daten) ziemlich langsam wird, nach Eigenschaften zu suchen, die in Meta gefunden werden. Sie durchsuchen zuerst alle Einträge in der Metatabelle nach den Kriterien, die Sie benötigen, und erhalten dann den entsprechenden Beitrag aus der Tabelle. Der Kicker ist, dass Sie nach JEDEM Kriterium separat suchen müssen. Bei einer Suche nach einem Tag erhalten Sie die Posts mit dem Wert X für 'meta1'. Anschließend suchen Sie nach zweiten Kriterien, z. B. customcriteria, und erhalten Post-IDs mit customcriteriavalue1 in customcriteria. Nehmen Sie dann den Schnittpunkt dieser Kriterien und gehen Sie zu get die Beitragsdetails aus der Beitragstabelle mit diesem Schnittpunkt.
Wenn Sie beispielsweise 30.000 Produkte in WooCommerce einfügen, erhalten Sie in wp_postmeta ~ 1.800.000 Zeilen, wie in der folgenden Antwort erläutert:
Post-Meta gegen separate Datenbanktabellen
Dies macht nicht nur die Suche sehr, sehr ineffizient (insbesondere, wenn Sie sich bei wp_postmeta nach mehreren Kriterien selbst verbinden), sondern auch das Abfragen einer einzelnen Zeile aus 1,8 Millionen Zeilen führt zu einem Leistungseinbruch.
EAV-Schema-Mangel.
Bei vielen Posts macht die Implementierung von WordPress db komplexe Suchvorgänge sehr langsam.
Das Ausführen einer WordPress-Site mit Tausenden von Posts ist durchaus machbar, wenn Sie Caching-Plugins verwenden. Sie können noch mehr gehen. Aber die Suche wird ein Problem sein.
............
Dies gilt auch für Benutzer - wp_usermeta verwendet ebenfalls dasselbe EAV-Format. Wenn Sie also viele Benutzer haben und viele Plugins haben, die verschiedene Benutzerdaten in wp_usermeta speichern, werden Sie den gleichen Leistungseinbruch erleiden.
Ganz zu schweigen von so vielen Benutzern, dass Sie wahrscheinlich bereits eine hohe Anzahl von Posts haben - es sei denn, Ihre App hat hauptsächlich mit Benutzern zu tun (CRM usw.) und Sie speichern Ihre Benutzerdaten in wp_usermeta anstelle von wp_postmeta . (Unwahrscheinlich).
.........
Es gibt einige Plugins, die versuchen, dieses Problem zu umgehen, wie z. B. Meta Accelerator.
https://wordpress.org/plugins/meta-accelerator/
Dieses Plugin nimmt alle Daten für einen bestimmten Beitragstyp auf und legt sie in flachen Tabellen ab. Dies beschleunigt die Suche erheblich und das Abfragen von Einzelwerten.
Aber dieses Plugin steckt noch in den Kinderschuhen.
Alternativ können Sie ElasticSearch auf dem Server installieren und das ElasticPress-Plugin oder ein anderes Plugin verwenden, das es in WordPress integriert, um solche Suchvorgänge zu beschleunigen.
PHP
Teil des Stapels nicht Ihr Problem (Facebook wird mit einem modifizierten PHP erstellt), könnte aberMySQL
sehr gut einschränkend sein.Ich habe festgestellt, dass der Flaschenhals für die Anzahl der Wordpress-Benutzer, die Sie haben können, das PHP-Timeout ist, das auf der Benutzeradministrationsseite ins Spiel kommt.
Angenommen, alle Ihre Benutzer haben mindestens eine Rolle, dann haben sie einen
wp_capabilities
Eintrag in deruser_metadata
Tabelle mit einem serialisierten Array von Rollen.Auf der Administrationsseite wird angezeigt, wie viele Benutzer mit den einzelnen Rollentypen vorhanden sind. Daher muss jedes einzelne serialisierte Array von wp_capabilities geladen, unserialisiert und anschließend eine Gesamtanzahl angezeigt werden.
Wenn ich 300.000 Benutzer habe, dauert die Erstellung der Benutzeradministrationsseite 44 Sekunden.
Dies bedeutet, dass jeder Benutzer der Ladezeit der Seite 0,00014666666 Sekunden hinzufügt.
Angenommen, Ihr PHP-Timeout beträgt 60 Sekunden, was ein Limit von rund 400.000 Benutzern bedeuten würde.
Ich verwende jedoch einen ziemlich alten und langsamen Server. Schnellere Hardware würde die Dinge erheblich verbessern.
quelle