Aller au contenu Aller au menu
Vous êtes ici : Développement > MySQL > 4) Corriger les requêtes lentes > b) L'analyse post-mortem
Langue : fr

b) L'analyse post-mortem

L'utilisation d'un site par les utilisateurs ne correspond pas toujours exactement à l'utilisation qui en a été faite par des testeurs. Au final, des requêtes qui semblaient optimisées en recette peuvent ralentir le serveur en production. Pour y remédier, il faut tout d'abord les identifier. C'est l'objet des paramètres long_query_time et log_slow_queries (ce dernier étant désormais remplacé par slow_query_log et slow_query_log_file depuis MySQL 5.1.29). Toutes les requêtes prenant plus de 10 secondes (valeur par défaut de long_query_time) à s'exécuter seront enregistrées dans un fichier de log.

L'utilisation de ces paramètres se fait soit en ligne de commande au lancement du serveur MySQL, soit plus simplement, en ajoutant ces lignes dans le fichier de configuration my.ini (sous Windows) ou my.cnf (sous Unix).

Par exemple :
[mysql]
long_query_time = 5
log_slow_queries = "D:/MySQL-Data/slow_queries.log"

Toute requête qui entre dans ce fichier de log devrait définitivement être améliorée.

D'autres paramètres peuvent être intéressants pour des analyses temporaires :

  • log (general_log et general_log_file depuis MySQL 5.1.29) : enregistre toutes les requêtes exécutées. Inutile de dire que cette option peut fortement ralentir le serveur
  • log_queries_not_using_indexes (intégré dans log_slow_queries depuis MySQL 5.1.29) : enregistre les requêtes qui n'utilisent pas d'index. Toutes les requêtes concernées ne sont pas forcément mal écrites : par exemple, récupérer l'ensemble des profils d'utilisateurs afin de créer la boîte de sélection du profil d'un nouvel utilisateur fait un full scan d'une table, même s'il s'agit au final d'une table de quatre ou cinq enregistrements.

Si malgré toutes les optimisations réalisées, vos requêtes sont toujours lourdes, alors peut-être s'agit-il plutôt d'un problème de conception : réfléchissez à votre architecture, peut-être que certaines de vos données devraient être pré-calculées et stockées ?

  1. MySQL
    1. 1) Bien concevoir la base de données
      1. a) Choix des tables – Normalisation des données
      2. b) Choix et typage des champs
    2. 2) Indexer les données
      1. a) L'index : un marque-page dans la base de données
      2. b) Une forte cardinalité pour un bon index
      3. c) Une utilisation récurrente pour un bon index
      4. d) Gare aux contre-optimisations
    3. 3) Optimiser les requêtes SQL
      1. a) Utiliser la richesse du langage SQL
      2. b) Optimiser les jointures
      3. c) Mettre à profit une bonne indexation
    4. 4) Corriger les requêtes lentes
      1. a) L'optimisation de requête par EXPLAIN
      2. b) L'analyse post-mortem
    5. 5) Le serveur MySQL – maintenance et backup
      1. a) Minimiser l'impact des opérations de maintenance
      2. b) Sauvegarde et restauration des bases de données
      3. c) Maintenance des tables