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 laPRIMARY 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
deVARCHAR(255)
, pasVARCHAR(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
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