Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi les références à wp_postmeta sont-elles si lentes ?

Le schéma standard pour wp_postmeta fournit des indices médiocres. Cela entraîne des problèmes de performances.

En changeant le schéma en celui-ci, la plupart des références aux métadonnées seront plus rapides :

CREATE TABLE wp_postmeta (
    post_id …,
    meta_key …,
    meta_value …,
    PRIMARY KEY(post_id, meta_key),
    INDEX(meta_key)
) ENGINE=InnoDB;

Remarques :

  • Le AUTO_INCREMENT actuel la colonne est un gaspillage d'espace et ralentit les requêtes car c'est la PRIMARY KEY , évitant ainsi le PK "naturel" "composite" de (post_id, meta_key) .
  • InnoDB améliore encore les performances de ce PK grâce au "clustering". (J'espère que vous n'utilisez pas encore MyISAM !)
  • Si vous utilisez MySQL 5.6 (ou MariaDB 10.0 ou 10.1), modifiez meta_key de VARCHAR(255) , pas VARCHAR(191) . (Nous pouvons discuter des raisons et des solutions de contournement dans une question distincte, si 191 n'est pas suffisant.)
  • INDEX(meta_key) est facultatif, mais nécessaire si vous souhaitez "trouver des messages qui ont une clé particulière".
  • Mise en garde :Ces modifications vont accélérer beaucoup utilisations de postmeta, mais pas toutes. Je ne pense pas cela ralentira tous les cas d'utilisation. (Veuillez fournir de telles requêtes si vous les rencontrez. Il peut s'agir d'un problème de mise en cache, pas d'une véritable dégradation.)

Si vous souhaitez présenter votre CREATE TABLE , je peux fournir un ALTER pour le convertir en ceci.

Si vous avez besoin de la possibilité d'avoir plusieurs clés méta avec le même nom de clé pour une publication, utilisez cette solution. C'est presque aussi bon que la suggestion ci-dessus.

    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

Document source

ALTER Possible

Mises en garde :

  • Je n'ai aucun moyen de tester cela.
  • Cela ne résout pas l'erreur 767
  • Ceci conserve meta_id parce qu'un utilisateur de WP a fait remarquer qu'il est référencé par d'autres tables.
  • Cela suppose que vous pourriez avoir plusieurs lignes pour un combo (post_id, meta_key). (Cela ressemble à une mauvaise conception de schéma ?)
  • Tout cela ne fait qu'accélérer les SELECTs typiques impliquant postmeta.
  • Cela s'applique probablement aussi au woocommerce.
  • Si vous l'utilisez, videz votre base de données et soyez prêt à la recharger en cas de problème.

Le 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