Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum sind Verweise auf wp_postmeta so langsam?

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 den PRIMARY 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 von VARCHAR(255) , nicht VARCHAR(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

Quelldokument

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