Si votre plugin va avoir BEAUCOUP de données, alors utiliser le wp_postmeta
n'est PAS une bonne idée comme démontré ci-dessous:
En prenant WooCommerce comme exemple, dans un magasin avec environ 30 000 produits, il y aura en moyenne environ 40 méta post (attributs et tout) par produit, 5 images de produit par produit, ce qui signifie qu'il y aura environ 4 méta d'image pour chaque image:
30 000 produits x 40 méta chacun = 1 200 000 lignes en wp_postmeta
+
30 000 produits x 5 images chacun x 4 méta d'image pour chacun = 600 000 lignes en wp_postmeta
Donc, avec seulement 30 000 produits, vous envisagez d'avoir 1 800 000 lignes wp_postmeta
.
Si vous ajoutez plus de propriétés à vos produits ou à vos images de produits, ce nombre se multipliera.
Le problème est double:
- Les auto-jointures coûtent très cher avec MySQL
wp_postmeta
la table n'est pas indexée sauf si vous utilisez des versions ultérieures de mysql (c'est-à-dire pas d'index FULLTEXT pour meta_value
)
Pour donner un exemple à partir d'un cas réel:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
Cela sélectionne la ville d'expédition de tous les détails de la commande à environ 3 secondes sur un serveur dédié d'entrée de gamme, même s'il y a 5 à 10 commandes . En effet, la requête est exécutée à partir d'une wp_postmeta
table qui contient environ 3 millions de lignes dans l'installation en direct.
Même la page d'accueil est assez lente, car le thème tire divers éléments de wp_postmeta
- curseurs, quelques encarts de révision, quelques autres méta. En général, la liste des produits est très lente, les recherches sont également lentes lors de la liste des produits.
Vous ne pouvez pas résoudre ce problème par tout moyen normal. Vous pouvez mettre Elastic Search sur votre serveur et utiliser un plugin Elastic Search dans Wordpress, vous pouvez utiliser redis / memcached, vous pouvez utiliser un bon plugin de cache de page, mais à la fin le problème fondamental restera - récupérer toute quantité de données à partir d'un ballonnement wp_postmeta
la table sera lente, chaque fois que cela sera fait. Sur le serveur sur lequel j'ai testé la solution que j'ai implémentée ci-dessous, tous ces éléments ont été installés et configurés correctement et optimisés, et le site a fonctionné convenablement bien pour les utilisateurs non connectés ou les requêtes courantes depuis la mise en cache des plugins.
Mais au moment où un utilisateur connecté a essayé de faire quelque chose qui n'était pas communément fait ou les crons, les plugins de mise en cache ou tout autre utilitaire ont voulu récupérer les données réelles de la base de données pour les mettre en cache ou faire autre chose, les choses se sont ralenties.
J'ai donc essayé autre chose:
J'ai codé un petit plugin pour prendre toutes les méta du produit (postmeta pour le produit de type post ) dans une table personnalisée générée par le code. Ce plugin a pris toutes les méta pour chaque publication et a créé un tableau en ajoutant chaque méta en colonnes et en insérant les valeurs dans chaque ligne. J'ai transformé le format EAV en un format relationnel horizontal et plat. J'ai également eu le plugin pour supprimer postmeta de tous les produits déplacés de la wp_postmeta
table.
Pendant que j'y suis, j'ai déplacé le postmeta des pièces jointes et tous les autres méta des types de messages vers leurs propres tables.
Ensuite, je me suis accroché au get_(post_type)_meta
filtre pour remplacer la récupération des métadonnées pour les servir à partir de nouvelles tables personnalisées.
Maintenant, la même requête que précédemment, qui prenait ~ 3 secondes à récupérer, wp_postmeta
prend ~ 0,006 seconde. Le site se comporte désormais comme s'il s'agissait d'une nouvelle installation WP.
....................
Naturellement, il est préférable de faire les choses à la manière de Wordpress. C'est en fait la norme.
Cependant , il est également évident que la table EAV est très inefficace dans la mise à l'échelle. Il est infiniment flexible et vous permet de stocker toutes les données, mais le prix que vous payez pour cela est la performance. C'est un compromis fondamental.
Dans ce contexte, il est difficile de dire à quelqu'un qui a l'intention d'avoir une tonne de données et - Dieu nous en préserve - de rechercher / rechercher sur ces données pour utiliser la wp_postmeta
table à coup sûr. Le succès de performance sera formidable.
L'utilisation de vos tableaux personnalisés permettra à vos données de s'accumuler et de rester suffisamment rapides.
Tout comme la façon dont Pippin Williams, le créateur du plugin Easy Digital Downloads, a indiqué qu'il utiliserait des tableaux personnalisés s'il commençait à coder son plugin, si vous allez créer quelque chose qui sera utilisé pendant longtemps ou accumuler beaucoup de données, il est plus efficace d'utiliser vos tableaux personnalisés si vous les concevez bien.
Vous devez vous assurer que tout autre développeur de plugin / addon a les moyens de se connecter à votre plugin pour manipuler vos données avant et après la récupération des données. Si vous faites cela, alors vous êtes assez solide.