Maison > Article > développement back-end > Qu’est-ce qu’une requête lente php mysql ?
La requête lente php mysql fait référence à l'enregistrement des instructions SQL qui s'exécutent relativement lentement dans le journal. L'activation du journal des requêtes lentes permet à MySQL d'enregistrer les requêtes qui dépassent le temps spécifié. En localisant et en analysant les goulots d'étranglement des performances, la base de données peut être mieux optimisée. performances du système.
L'environnement d'exploitation de cet article : système Windows7, version PHP7.1, ordinateur DELL G3
php Qu'est-ce qu'une requête lente MySQL ?
La requête lente MySQL enregistre les instructions SQL qui s'exécutent lentement dans le journal. Cette fonction doit être activée pour pouvoir l'utiliser.
1. Introduction
L'activation du journal des requêtes lentes permet à MySQL d'enregistrer les requêtes qui dépassent la durée spécifiée en localisant et en analysant les goulots d'étranglement des performances, les performances du système de base de données peuvent être mieux optimisées.
2. Introduction aux paramètres
slow_query_log état d'ouverture des requêtes lentes
slow_query_log_file L'emplacement où le journal des requêtes lentes est stocké (ce répertoire nécessite les autorisations d'écriture du compte MySQL en cours d'exécution et est généralement défini sur le répertoire de stockage de données MySQL)
long_query_time Durée pendant laquelle la requête dépasse Enregistrer chaque seconde, la valeur par défaut est de 10 secondes
3 Activer la requête lente
(1) Afficher les paramètres liés à la requête lente
mysql> show variables like 'slow_query%'; +---------------------------+-----------------------------------+ | Variable_name | Value | +---------------------------+-----------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /usr/local/var/mysql/slow.log | +---------------------------+-----------------------------------+ mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+
(2) Méthode de configuration
Méthode 1 : Paramétrage de la variable globale.
Définissez la variable globale slow_query_log sur le statut « ON »
mysql> set global slow_query_log='ON';
Définissez l'emplacement où le journal des requêtes lentes est stocké
mysql> set global slow_query_log_file='/usr/local/var/mysql/slow.log ';
Définissez la durée de la requête lente et enregistrez la requête si elle dépasse 1 seconde
mysql> set global long_query_time=1;
Méthode 2 : Configuration paramètres du fichier
Modifiez le fichier de configuration my.cnf, sous [mysqld] Ajoutez
[mysqld] slow_query_log = ON slow_query_log_file = /usr/local/var/mysql/slow.log long_query_time = 1
ci-dessous (3) Redémarrez le service MySQL
service mysqld restart
(4) Analyse du journal des requêtes lentes
Interceptez un journal des requêtes lentes :
# Time: 180918 19:06:21 # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707197 # Query_time: 1.015429 Lock_time: 0.000116 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc; # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707236 # Query_time: 1.021662 Lock_time: 0.000083 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '14433' and app_type = 'YGY' order by binding_time desc;
Vous peut voir ici :
Query_time (le temps de requête de l'instruction de requête lente) dépasse tous les 1 définis,
Rows_sent (enregistrements renvoyés par une requête lente) Un seul
Rows_examined (nombre de lignes analysées par une requête lente) a été renvoyé ici 44438 -> On peut voir d'ici que le problème est énorme
Maintenant, nous allons mettre cette instruction SQL dans la base de données pour l'exécution et utiliser EXPLAIN pour analyser le plan d'exécution
EXPLAIN select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc;
Le résultat de la requête est :
Expliquez les paramètres :
Vous pouvez trouver ici : rows est le nombre de lignes dans la requête, requête Après avoir lu plus de 40 000 lignes, c'est définitivement lent.
Parce qu'il y a plusieurs conditions ici, et qu'aucun index n'est utilisé, le seul moyen est d'ajouter un index
Ajoutez un index multi-colonnes normal à la sélection, car il y a eu un problème avec la conception de ce tableau au niveau. au début, ce qui entraîne une duplication des données, un index unique ne peut pas être défini.
ALTER TABLE app_mobile_device ADD INDEX user_app_type_only ( `user_id` ,`app_type` )
L'index est défini, jetons un œil au plan d'exécution du SQL tout à l'heure.
Vous constaterez que le nombre de lignes vérifiées a visiblement diminué.
À ce stade, l'utilisation et l'optimisation des requêtes lentes sont pratiquement terminées.
Apprentissage recommandé : "Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!