Recherche et correction des requêtes de base de données WordPress lentes

Les requêtes SQL lentes peuvent réduire les performances de votre site WordPress. Parfois, les requêtes lentes sont le résultat d'un SQL mal formé qui n'aurait jamais dû être fait de cette façon. Et parfois, les requêtes lentes étaient en fait des requêtes rapides à un moment donné, mais à mesure que le site vieillissait, la requête devenait de plus en plus lente, incapable de suivre la base de données en expansion.
Quelle que soit la lenteur de votre SQL, examinons quelques façons de rechercher et de résoudre les requêtes problématiques dans WordPress.

Recherche de requêtes lentes

La recherche de la source des requêtes lentes implique 2 étapes:

  • Identifier les requêtes qui sont en fait les plus lentes.
  • Trouver le code qui les génère et les exécuter.
  • Examinons deux plugins et un SaaS qui peuvent nous aider à trouver des requêtes lentes.

    Moniteur de requête

    Query Monitor est un plugin qui fournit une tonne d'informations sur la page actuelle. En plus d'un tas d'informations sur le fonctionnement interne de WordPress, il donne une ventilation détaillée de:

    • Combien de requêtes se sont produites sur cette demande
    • Quelles requêtes sur la page ont pris le plus de temps
    • Quelles fonctions ont passé le plus de temps sur les requêtes SQL
    • Que ces requêtes proviennent de plugins, de thèmes ou du noyau WordPress

    Le moniteur de requêtes identifie même les requêtes lentes avec du texte rouge effrayant, ce qui facilite la détection du problème SQL:

    Barre de débogage

    Un autre excellent outil pour trouver un SQL glacialement lent est l'ancien plugin Debug Bar. La barre de débogage vous donne des informations sur le fonctionnement interne de WordPress lorsque vous chargez une page avec des choses comme:

  • Paramètres WP_Query
  • Demander des informations (y compris la correspondance des règles de réécriture)
  • Requêtes SQL générées par la page en cours
  • Pour activer # 3 (suivi SQL) dans la barre de débogage, assurez-vous d'activer SAVEQUERIES quelque part sur votre site – probablement dans wp-config.php – comme ceci:
    if (! defined ('SAVEQUERIES'))
      define ('SAVEQUERIES', true);

    Avertissement: SAVEQUERIES a un effet sur les performances de votre site et ne devrait probablement pas être utilisé sur un serveur de production. Utilisez-le à la place sur une machine de développement.
    Trouver un SQL lent n'est pas aussi simple avec la barre de débogage. Par exemple, il ne fournit pas les tableaux triables ni ne met en évidence les requêtes lentes pour vous. La barre de débogage fournit une trace de fonction qui vous indique exactement où trouver la source d'une requête.
    Il s'agit d'une liste des fichiers chargés et des fonctions qui entraînent l'exécution de la requête. La plupart du temps, vous êtes intéressé par la toute dernière entrée de la liste; c'est là que la requête lente a été exécutée et où vous devez commencer votre recherche. La chose pratique d'avoir le contexte de chaque fonction unique qui mène à cette requête est qu'elle peut éclairer pourquoi le SQL a été exécuté en premier lieu.

    NewRelic

    NewRelic un service qui mesure et surveille les performances de votre application web, y compris WordPress. Le service fournit une tonne d'informations sur les performances de votre site. Il est facile de se perdre dans les données que NewRelic vous donne, de l'exécution détaillée du code aux pannes ligne par ligne pour les requêtes SQL.
    Il existe deux différences majeures entre NewRelic et les plugins que nous avons mentionnés précédemment:

  • NewRelic donne beaucoup plus de détails sur les performances de votre PHP, jusqu'au nombre de millisecondes passées dans chaque fonction
  • NewRelic suit chaque requête vers votre site en arrière-plan, vous pouvez donc y faire référence plus tard pour trouver un SQL lent. Les plugins ne vous donnent que la page actuelle.
  • Il convient de noter que NewRelic a un niveau de plan gratuit qui donne des informations générales sur les performances de votre site, mais que vous devrez passer à un plan payant pour les cloches et les sifflets pour surveiller les demandes individuelles et trouver les requêtes lentes.

    Comprendre une requête lente avec EXPLAIN

    Jusqu'à présent, nous avons couvert des outils pour trouver des requêtes lentes. Voyons maintenant pourquoi ces requêtes gênent les choses.
    Le mot clé MySQL EXPLAIN peut aider, euh, à expliquer ce qui se passe. L'ajout d'EXPLAIN au début d'une requête montre comment MySQL exécute une requête. Pour les requêtes complexes, EXPLAIN peut aider à identifier les points lents dans vos SQL, tels que les sous-requêtes lentes ou les opérations inefficaces.
    Par exemple, si vous aviez une requête qui ressemblait à ceci:
    SELECT slow_column FROM slow_table
    Vous pouvez EXPLIQUER cette requête en exécutant simplement ce qui suit:
    EXPLAIN SELECT slow_column FROM slow_table
    Voici à quoi ressemble la sortie d'EXPLAIN dans phpMyAdmin:
    Heck, je ne reconnais pas tous les fonctionnements internes de MySQL, mais exécuter EXPLAIN sur des requêtes donne toujours un aperçu de la façon dont MySQL exécute mon SQL. La requête utilise-t-elle un index? Est-ce qu'il scanne toute la table? Même pour les requêtes simples, EXPLAIN fournit une petite quantité d'informations pour aider à comprendre ce qui se passe.
    Vous pouvez exécuter EXPLAIN à partir de la ligne de commande MySQL ou de votre outil MySQL préféré.

    Correction des requêtes lentes

    Maintenant que nous savons que notre requête est lente, et EXPLAIN nous a expliqué pourquoi, examinons quelques options pour résoudre ces problèmes lents.

    Option 1: modifier la requête

    Sur CSS-Tricks, nous avions une requête qui faisait glisser l'écran Edit Post au rythme d'un escargot. La requête faisait partie de la méta-zone Champs personnalisés. Voici le SQL:
    SELECT meta_key
    FROM wp_postmeta
    GROUP BY meta_key
    LA MÉTA-TOUCHE N'AIME PAS '\ _%'
    COMMANDER PAR meta_key
    LIMIT 100
    Ce bit particulier de SQL récupère une liste de méta-clés de la table wp_postmeta qui ne commencent pas par un trait de soulignement (_). L'instruction GROUP BY signifie que chaque résultat est unique.
    Exécutez cette requête 5 fois, voici combien de temps cela prend:
    1,7146 sec 1,7912 sec 1,8077 sec 1,7708 sec 1,,8456 sec
    Pourrions-nous écrire une requête différente pour obtenir le même résultat? Nous devons sélectionner des méta-clés uniques. Unique est un synonyme de distinct, qui se trouve être une instruction SQL!
    À l'aide de l'instruction DISTINCT, nous pouvons effectuer les opérations suivantes:
    SELECT DISTINCT meta_key
    FROM wp_postmeta
    O met la méta-clé N'AIME PAS '\ _%'
    COMMANDER PAR meta_key
    L'exécution de notre requête réécrite plusieurs fois donne les résultats suivants:
    0,3764 seconde 0,2607 seconde 0,2661 seconde 0,2751 seconde 0,2986 seconde
    Ce n'est pas une comparaison scientifique mais révèle une amélioration significative!

    Option 2: ajouter un index

    Lorsque vous exécutez une requête SQL sur une table MySQL standard, MySQL doit analyser la table entière pour déterminer quelles lignes sont pertinentes pour cette requête particulière. Lorsque votre table devient vraiment grande, cette numérisation commence à prendre du temps.
    C’est là que les index MySQL entrent en jeu. Les index prennent les données dans une table et les organisent de manière à rendre les données beaucoup plus faciles à localiser. En organisant les données d'une manière particulière, les index aident à réduire la quantité d'analyse que MySQL effectue pour chaque requête.
    Les index peuvent être ajoutés à des colonnes uniques ou sur plusieurs colonnes. La syntaxe ressemble à ceci:
    CRÉER UN INDEX wp_postmeta_csstricks ON wp_postmeta (meta_key)
    Avec un index sur meta_key, l'heure de la requête SQL d'origine ressemble à ceci:
    0,0042 sec0,0024 sec0,0031 sec0,0026 sec0,0020 sec
    C'est vraiment accrocheur!
    Un mot d'avertissement sur les index: chaque fois que INSERT crée une ligne ou UPDATE est utilisé sur une table indexée, l'index est recalculé, ce qui peut être une opération coûteuse. Les index accélèrent la lecture de la table, mais l'écriture dans la table est plus lente. Un index bien placé peut faire voler vos requêtes, mais ne devenez pas fou d'index sans surveiller les effets globaux de l'index sur votre base de données.

    Option 3: mettre en cache les résultats de la requête

    Nous savons que nous avons une requête lente. Au lieu de modifier la requête, que se passe-t-il si nous venons de stocker les résultats de la requête? De cette façon, nous limiterions la fréquence à laquelle la requête a été effectuée et nous obtiendrions un "laissez-passer gratuit" la plupart du temps.
    Pour mettre en cache la requête, nous pourrions utiliser l'API WordPress Transients. Les transitoires sont utilisés pour stocker les résultats d'opérations coûteuses, telles que:

    • Demandes à des sites Web externes (par exemple, récupérer des publications Facebook récentes)
    • Morceaux de traitement lents (par exemple, recherche de grandes chaînes avec une expression régulière)
    • Requêtes de base de données lentes!

    Le stockage d'un résultat de requête avec des transitoires ressemble à ceci:
    if (false === ($ results = get_transient ('transient_key_name')))
      $ results = …; // Faites la requête lente pour obtenir les résultats ici
      // 60 * 60 est l'expiration en secondes – dans ce cas, 3600 secondes (1 heure)
      set_transient ('transient_key_name', $ results, 60 * 60);

    Stocker les résultats de la requête dans un transitoire comme cela signifie que la requête ne sera effectuée qu'une fois toutes les heures environ. Cela nous amène au GRAND AVERTISSEMENT TRANSITOIRE: Soyez prudent en utilisant des transitoires pour des choses qui changent beaucoup.
    Si vous avez une requête avec des résultats qui ne changeront pas souvent, l'utilisation de transitoires est un moyen astucieux d'éviter de frapper si souvent la base de données.

    Choisir une approche

    Nous avons décrit trois options et il existe probablement 17 autres façons de résoudre cette requête lente. Quelle approche adoptons-nous?
    Lorsque je travaille sur du code qui n'est pas le mien, je préfère suivre la maxime du programmeur: "Faites la chose la plus simple qui puisse fonctionner."
    L'option 1 (réécriture de la requête) a donné d'excellents résultats, mais que se passe-t-il si la requête réécrite n'a pas toujours les mêmes résultats? Nous pourrions inconsciemment bork notre code avec une requête légèrement désactivée.
    L'option 2 (ajout d'un index) n'est pas toujours possible selon la table et les colonnes utilisées par la requête. Dans le cas des tableaux de base WordPress, vous devez vous soucier des effets secondaires des index:

    • La routine de mise à jour principale attend-elle des index supplémentaires?
    • L'ajout d'un index ralentira-t-il d'autres requêtes, comme INSERT et UPDATE?

    L'option 3 (mise en cache des résultats via des transitoires) a un impact minimal: nous ne modifions pas la requête d'origine et nous n'avons pas besoin de modifier la structure de la base de données.
    La plupart du temps, j'utilise l'option 3. Dans votre cas particulier, vous pouvez choisir une autre option en fonction de la requête que vous corrigez ou du site particulier ayant des problèmes SQL. Il n’existe pas de solution unique à la plupart des problèmes de performances, vous êtes donc libre d’être en désaccord avec mon choix – ou, essayez les trois à la fois!

    Restez à l'écoute

    Nous avons souligné ici un vrai problème. La boîte Champs personnalisés sur CSS-Tricks était vraiment un coupable pour certaines requêtes de base de données très lentes. Nous avons également décrit différentes voies vers des solutions potentielles, mais nous ne vous avons en fait pas donné de véritable solution codée. Nous publierons un deuxième article qui couvrira cela très prochainement et, espérons-le, vous donnera les outils nécessaires pour corriger vos propres requêtes lentes après les avoir découvertes.

    Pourquoi la mise en cache est-elle importante

    La mise en cache est importante car donne l’opportunité de réduire la charge sur vos serveurs d’hébergement WordPress et d’effectuer fonctionner votre boutique ou votre site web plus rapidement. Vous devez mettre à sa place une mise en cache adéquate pour stimuler la vitesse et exploit de votre WordPress. Un emplacement web plus rapide améliore l’expérience des utilisateurs et les encourage à visiter davantage de pages. Cela vous permet également de renforcer la garantie et le temps que fans passent sur votre forum ou site web. Un lieu web plus rapide vous permet d’augmenter le commerce vers votre forum ou votre site web grâce à la recherche organique. Google donne un avantage SEO significatif aux sites internet plus rapides, ce qui vous donne l’opportunité d’avoir un premier classement dans les bénéfices de recherche. Cela étant dit, examinons plus puissants plugins convenable en cache WordPress que vous pouvez utiliser pour augmenter la vitesse de votre blog ou votre site internet web.

    vince

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *