J'exécute une grande instance WP (qui compte actuellement plus de 28 000 publications dans des types personnalisés) et j'ai connu quelques ralentissements inhabituels. Lors de l'analyse du journal de requêtes lentes de MySQL, l'une des requêtes à problèmes est la suivante:
SELECT COUNT(*) FROM wp_term_relationships, wp_posts
WHERE
wp_posts.ID = wp_term_relationships.object_id
AND post_status = 'publish'
AND post_type IN ('s5_video', 's5_post', 's5_one_liner', 's5_image')
AND term_taxonomy_id = 1498
(s5_video, s5_post, s5_one_liner et s5_image sont nos types personnalisés)
Faire une explication sur la requête donne les résultats suivants:
Maintenant, 23 000 lignes analysées, c'est beaucoup, mais ce n'est pas terrible, surtout pour une requête qui n'est pas exécutée trop fréquemment. En fait, dans mes tests manuels, la plupart du temps, la requête ne prend que 50 ms environ à exécuter (probablement parce qu'elle se trouve toujours dans le cache de requêtes de MySQL). Cependant, parfois, la requête nécessite 12-16 secondes pour s'exécuter.
Je suppose que j'ai deux questions:
Notre VPS de milieu de gamme dispose de beaucoup de puissance pour traiter ce type de requête (8 processeurs, 4 Go de RAM). Le résultat SQL EXPLAIN montre que MySQL utilise les clés pour générer le résultat. Compte tenu de la capacité de notre serveur, ainsi que de l'utilisation des clés, 12-16 secondes pour analyser des lignes 24k ne vous semblent-elles pas un peu extrêmes? (C'est environ 1500 lignes par seconde . Beurk!) Pourquoi cela se passe-t-il? Cela est-il arrivé dans les grandes instances de WP de quelqu'un d'autre?
Des suggestions sur quoi faire? Normalement, dans une situation comme celle-ci, j'ajouterais des index pour accélérer les choses, mais MySQL utilise déjà les bonnes clés. Et pour autant que je sache, cette requête est intégrée au cœur de Wordpress (elle ne fait pas partie de notre code personnalisé) et est assez simple pour que je ne puisse pas penser à la façon de l'optimiser davantage ...?
Préparez-vous à une réponse peu satisfaisante ...
Après plusieurs jours de tests, la conclusion à laquelle je suis arrivé est que, simplement, ce n'est pas la "faute" de Wordpress. Je pense qu’un autre problème lié au serveur mettait le système indûment à l’abri. Il s’agissait simplement d’une des requêtes les plus lentes, qui, du fait que le serveur était sous tension, a rapidement atteint le sommet de notre journal des requêtes lentes, avec des temps compris entre 12 et 16 secondes.
Cela ne signifie pas que je suis satisfait de la taille de la jointure de 23,608 (VERY BAD, VERY SLOW)
. Cependant, cela signifie que pour les autres visiteurs de cette question, la solution à votre problème spécifique peut être d'examiner votre système dans son ensemble pour déterminer pourquoi cette requête (ou une autre) fonctionne si mal.
Bonne codage!