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

Performances MySQL :identification des requêtes longues

Chaque application soutenue par MySQL peut bénéficier d'un serveur de base de données finement réglé. L'équipe d'assistance de Liquid Web Heroic a rencontré de nombreuses situations au fil des ans où certains ajustements mineurs ont fait toute la différence dans les performances des sites Web et des applications. Dans cette série d'articles, nous avons présenté certaines des recommandations les plus courantes qui ont eu le plus grand impact sur les performances.

Vérification préalable

Cet article s'applique à la plupart des serveurs VPS MySQL basés sur Linux. Cela inclut, mais sans s'y limiter, les serveurs dédiés traditionnels et Cloud VPS exécutant une variété de distributions Linux courantes. L'article peut être utilisé avec les types de système Liquid Web suivants :

  • CentOS 6x/7x géré par le cœur
  • Ubuntu 14.04/16.04 géré par le cœur
  • CPanel CentOS 6/7 entièrement géré
  • CentOS 7 entièrement géré Plesk Onyx 17
  • Serveurs Linux autogérés
RemarqueLes systèmes autogérés, qui ont choisi de ne pas bénéficier de l'assistance directe, peuvent tirer parti des techniques décrites ici, cependant, l'équipe d'assistance de Liquid Web Heroic ne peut pas offrir d'assistance directe sur ces types de serveurs.

Cette série d'articles suppose que vous êtes familiarisé avec les concepts de base d'administration système suivants :

  • Connexions SSH et navigation de base de l'environnement de shell de ligne de commande Linux standard.
  • Ouvrir, éditer et enregistrer des fichiers dans Vim ou un éditeur système choisi.
  • Mode interactif MySQL et syntaxe générale des requêtes MySQL.

Qu'est-ce que l'optimisation MySQL ?

Il n'y a pas de définition clairement définie pour le terme optimisation MySQL. Cela peut signifier quelque chose de différent selon la personne, l'administrateur, le groupe ou l'entreprise. Pour cette série d'articles sur l'optimisation MySQL, nous définirons l'optimisation MySQL comme : la configuration d'un serveur MySQL ou MariaDB qui a été configuré pour éviter les goulots d'étranglement couramment rencontrés et abordés dans cette série d'articles.

Qu'est-ce qu'un goulot d'étranglement ?

Très similaire au goulot d'une bouteille de soda, un goulot d'étranglement en tant que terme technique est un point dans une configuration d'application ou de serveur où une petite quantité de trafic ou de données peut passer sans problème. Cependant, un plus grand volume du même type de trafic ou de données est entravé ou bloqué et ne peut pas fonctionner correctement tel quel. Voir l'exemple suivant d'un goulot d'étranglement de configuration :

Dans cet exemple, le serveur est capable de gérer 10 connexions simultanément. Cependant, la configuration n'accepte que 5 connexions. Ce problème ne se manifesterait pas tant qu'il y avait 5 connexions ou moins à la fois. Cependant, lorsque le trafic augmente jusqu'à 10 connexions, la moitié d'entre elles commencent à échouer en raison de ressources inutilisées dans la configuration du serveur. Les exemples ci-dessus illustrent la forme du goulot d'étranglement d'où il tire son nom par rapport à une configuration optimisée qui corrige le goulot d'étranglement.

Quand dois-je optimiser ma base de données MySQL ?

Idéalement, le réglage des performances de la base de données doit avoir lieu régulièrement et avant que la productivité ne soit affectée. Il est recommandé d'effectuer des audits hebdomadaires ou mensuels des performances de la base de données pour éviter que des problèmes n'affectent négativement les applications. Les symptômes les plus évidents des problèmes de performances sont :

  • Les requêtes s'empilent et ne se terminent jamais dans la table de processus MySQL.
  • Les applications ou les sites Web utilisant la base de données deviennent lents.
  • Erreurs de dépassement de délai de connexion, en particulier pendant les heures de pointe.

Bien qu'il soit normal que plusieurs requêtes simultanées s'exécutent simultanément sur un système occupé, cela devient un problème lorsque ces requêtes prennent trop de temps à se terminer régulièrement. Bien que le seuil spécifique varie selon le système et l'application, les temps de requête moyens dépassant plusieurs secondes se manifesteront par un ralentissement des sites Web et des applications connectés. Ces ralentissements peuvent parfois commencer petit et passer inaperçus jusqu'à ce qu'une forte augmentation du trafic frappe un goulot d'étranglement particulier.

Identifier les problèmes de performances

Savoir comment examiner la table de processus MySQL est essentiel pour diagnostiquer le goulot d'étranglement spécifique rencontré. Il existe plusieurs façons d'afficher la table de processus en fonction de votre serveur et de vos préférences. Par souci de brièveté, cette série se concentrera sur les méthodes les plus couramment utilisées via l'accès Secure Shell (SSH) :

Méthode 1. Utilisation de la table de processus MySQL

Utilisez le 'mysqladmin ' outil de ligne de commande avec le drapeau 'processlist ' ou 'proc ' pour faire court. (Ajout du drapeau ‘statistiques ' ou 'statistique ' pour faire court affichera les statistiques d'exécution des requêtes depuis le dernier redémarrage de MySQL.)

Commande :

mysqladmin proc stat

Sortie :

 +-------+------+-----------+-----------+---------+------+-------+
 | Id    | User | Host      | db        | Command | Time | State | Info               | Progress |
 +-------+------+-----------+-----------+---------+------+-------+--------------------+----------+
 | 77255 | root | localhost | employees | Query   | 150  |       | call While_Loop2() | 0.000    |
 | 77285 | root | localhost |           | Query   | 0    | init  | show processlist   | 0.000    |
 +-------+------+-----------+-----------+---------+------+-------+--------------------+----------+
 Uptime: 861755  Threads: 2  Questions: 20961045  Slow queries: 0  Opens: 2976  Flush tables: 1  Open tables: 1011  Queries per second avg: 24.323
Remarque :Pro  :utilisé sur l'interface shell, cela facilite la transmission de la sortie vers d'autres scripts et outils.Con  :La colonne d'informations de la table de processus est toujours tronquée et ne fournit donc pas la requête complète pour les requêtes plus longues.

Méthode 2 :Utilisation de la table de processus MySQL

Exécutez la requête "show processlist;" à partir de l'invite du mode interactif MySQL. (Aajouter le ' plein   le modificateur de la commande désactive la troncature du Informations colonne . Ceci est nécessaire lors de l'affichage de longues requêtes.)

Commande :

show processlist;

Sortie :

MariaDB [(none)]> show full processlist;
 +-------+------+-----------+-----------+---------+------+-------+-----------------------+----------+
 | Id    | User | Host      | db        | Command | Time | State | Info                  | Progress |
 +-------+------+-----------+-----------+---------+------+-------+-----------------------+----------+
 | 77006 | root | localhost | employees | Query   |  151 | NULL  | call While_Loop2()    |    0.000 |
 | 77021 | root | localhost | NULL      | Query   |    0 | init  | show full processlist |    0.000 |
 +-------+------+-----------+-----------+---------+------+-------+-----------------------+----------+
Pro  :L'utilisation du modificateur complet permet de voir la requête complète sur les requêtes plus longues.Con :Le mode interactif de MySQL ne peut pas accéder aux scripts et aux outils disponibles dans l'interface shell.

Utilisation du journal des requêtes lentes

Un autre outil précieux de MySQL est la fonctionnalité de journalisation des requêtes lentes incluse. Cette fonctionnalité est la méthode préférée pour rechercher régulièrement des requêtes de longue durée. Il existe plusieurs directives disponibles pour ajuster cette fonctionnalité. Cependant, les paramètres les plus couramment nécessaires sont :

slow_query_log activer/désactiver le journal des requêtes lentes
slow_query_log_file nom et chemin du fichier journal des requêtes lentes
long_query_time temps en secondes/microsecondes définissant une requête lente

Ces directives sont définies dans la section [mysqld] du fichier de configuration MySQL situé dans /etc/my.cnf et nécessiteront un redémarrage du service MySQL avant de prendre effet. Voir l'exemple ci-dessous pour le formatage :

Avertissement :Il existe un problème d'espace disque important avec le fichier journal des requêtes lentes, qui doit être surveillé en permanence jusqu'à ce que la fonction de journalisation des requêtes lentes soit désactivée. Gardez à l'esprit que plus votre directive long_query_time est basse, plus le journal des requêtes lentes remplit rapidement une partition de disque
[mysqld]
 log-error=/var/lib/mysql/mysql.err
 innodb_file_per_table=1
 default-storage-engine=innodb
 innodb_buffer_pool_size=128M
 innodb_log_file_size=128M
 max_connections=300
 key_buffer_size = 8M
 slow_query_log=1
 slow_query_log_file=/var/lib/mysql/slowquery.log
 long_query_time=5

Une fois le journal des requêtes lentes activé, vous devrez effectuer un suivi périodique avec lui pour examiner les requêtes indisciplinées qui doivent être ajustées pour de meilleures performances. Pour analyser le fichier journal des requêtes lentes, vous pouvez l'analyser directement pour examiner son contenu. L'exemple suivant montre les statistiques de l'exemple de requête qui a duré plus longtemps que les 5 secondes configurées :

AttentionL'activation de la fonctionnalité de journal des requêtes lentes entraîne une baisse des performances. Cela est dû aux routines supplémentaires nécessaires pour analyser chaque requête ainsi qu'aux E/S nécessaires pour écrire les requêtes nécessaires dans le fichier journal. Pour cette raison, il est recommandé sur les systèmes de production de désactiver le journal des requêtes lentes. Le journal des requêtes lentes ne doit rester activé que pendant une durée spécifique lors de la recherche active de requêtes gênantes susceptibles d'avoir un impact sur l'application ou le site Web.
# Time: 180717  0:23:28
 # User@Host: root[root] @ localhost []
 # Thread_id: 32  Schema: employees  QC_hit: No
 # Query_time: 627.163085  Lock_time: 0.000021  Rows_sent: 0  Rows_examined: 0
 # Rows_affected: 0
 use employees;
 SET timestamp=1531801408;
 call While_Loop2();

En option, vous pouvez utiliser l'outil de ligne de commande mysqldumpslow, qui analyse le fichier journal des requêtes lentes et regroupe les requêtes similaires à l'exception des valeurs de nombre et de données de chaîne :

~ $ mysqldumpslow -a /var/lib/mysql/slowquery.log
 Reading mysql slow query log from /var/lib/mysql/slowquery.log
 Count: 2  Time=316.67s (633s)  Lock=0.00s (0s)  Rows_sent=0.5 (1), Rows_examined=0.0 (0), Rows_affected=0.0 (0), root[root]@localhost
 call While_Loop2()

(Pour plus d'informations sur l'utilisation, consultez la documentation MySQL ici - mysqldumpslow – Résumer les fichiers journaux des requêtes lentes)

Conclusion

Ainsi conclut la première partie de notre série sur l'optimisation de la base de données et nous donne une base solide à laquelle nous référer à des fins de référence. Bien que les problèmes de base de données puissent être compliqués, notre série décomposera ces concepts pour fournir des moyens d'optimiser votre base de données via la conversion de base de données, la conversion de table et l'indexation.

Comment pouvons-nous vous aider ?

Nous sommes fiers d'être The Most Helpful Humans In Hosting™ !

Nos équipes d'assistance sont composées de techniciens Linux expérimentés et d'administrateurs système talentueux qui ont une connaissance intime de plusieurs technologies d'hébergement Web, en particulier celles abordées dans cet article.

Si vous avez des questions concernant ces informations, nous sommes toujours disponibles pour répondre à toute demande concernant des problèmes liés à cet article, 24 heures sur 24, 7 jours sur 7, 365 jours par an.

Si vous êtes un serveur VPS entièrement géré, un cloud dédié, un cloud privé VMWare, un serveur parent privé, des serveurs cloud gérés ou un propriétaire de serveur dédié et que vous n'êtes pas à l'aise avec l'une des étapes décrites, nous peut être contacté par téléphone au 800.580.4985, un chat ou un ticket d'assistance pour vous aider dans ce processus.

Navigation de la sérieArticle suivant>>