Das Standardschema für wp_postmeta
liefert schlechte Indizes. Dies führt zu Performance-Problemen.
Indem Sie das Schema hierin ändern, werden die meisten Verweise auf Metadaten schneller sein:
CREATE TABLE wp_postmeta (
post_id …,
meta_key …,
meta_value …,
PRIMARY KEY(post_id, meta_key),
INDEX(meta_key)
) ENGINE=InnoDB;
Hinweise:
- Der aktuelle
AUTO_INCREMENT
-Spalte ist Platzverschwendung und verlangsamt Abfragen, da es sich um denPRIMARY KEY
handelt , wodurch die „natürliche“ „zusammengesetzte“ PK von(post_id, meta_key)
vermieden wird . - InnoDB steigert die Leistung dieses PK durch "Clustering" weiter. (Ich hoffe, Sie verwenden MyISAM nicht immer noch!)
- Wenn Sie MySQL 5.6 (oder MariaDB 10.0 oder 10.1) verwenden, ändern Sie
meta_key
vonVARCHAR(255)
, nichtVARCHAR(191)
. (Wir können die Gründe und Problemumgehungen in einer separaten Frage diskutieren, falls 191 nicht ausreicht.) INDEX(meta_key)
ist optional, wird aber benötigt, wenn Sie "Beiträge finden möchten, die einen bestimmten Schlüssel haben".- Vorsicht:Diese Änderungen werden viele beschleunigen Verwendungen von Postmeta, aber nicht alle. Ich glaube nicht es wird alle Anwendungsfälle verlangsamen. (Bitte stellen Sie solche Anfragen, wenn Sie auf sie stoßen. Es könnte sich um ein Caching-Problem handeln, nicht um eine echte Verschlechterung.)
Wenn Sie Ihre präsentieren möchten CREATE TABLE
, kann ich einen ALTER
bereitstellen um es so umzuwandeln.
Wenn Sie die Möglichkeit benötigen, mehrere Metaschlüssel mit demselben Schlüsselnamen für einen Beitrag zu haben, verwenden Sie diese Lösung. Es ist fast so gut wie der obige Vorschlag.
meta_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, -- keep after all
...
PRIMARY KEY(post_id, meta_key, meta_id), -- to allow dup meta_key for a post
Möglich ALTER
Warnhinweise:
- Ich habe keine Möglichkeit, das zu testen.
- Dies behebt nicht den 767-Fehler
- Dies behält
meta_id
weil einige WP-Benutzer darauf hingewiesen haben, dass es von anderen Tabellen referenziert wird. - Es wird davon ausgegangen, dass Sie möglicherweise mehrere Zeilen für eine (post_id, meta_key)-Kombination haben. (Das scheint ein schlechter Schemaentwurf zu sein?)
- All dies beschleunigt typische
SELECTs
mit Postmeta. - Das gilt wahrscheinlich auch für Woocommerce.
- Wenn Sie dies verwenden, sichern Sie bitte Ihre Datenbank und seien Sie bereit, sie im Falle von Problemen neu zu laden.
Das SQL:
ALTER TABLE wp_postmeta
DROP PRIMARY KEY,
DROP INDEX post_id,
ADD PRIMARY KEY(post_id, meta_key, meta_id), -- to allow dup meta_key for a post
ADD INDEX(meta_id); -- to keep AUTO_INCREMENT happy