Performance MySQL / MariaDB
Base MySQL ou MariaDB lente : diagnostiquer avec le slow query log et MySQLTuner
Avant de toucher au my.cnf, il faut savoir ce qui est lent et pourquoi. Voici la méthode que nous suivons : mesurer, lire MySQLTuner avec recul, régler les quelques paramètres qui comptent, puis s'attaquer aux requêtes, là où se trouve presque toujours le vrai gain.
Le principe : mesurer avant de régler
Les articles « 10 paramètres pour accélérer MySQL » ont un défaut commun : ils donnent des valeurs sans connaître votre charge. Une base lente l'est rarement à cause d'un seul réglage. Le plus souvent, quelques requêtes concentrent l'essentiel du temps passé, parce qu'un index manque ou qu'une requête a été écrite pour 1 000 lignes et tourne aujourd'hui sur 10 millions.
La démarche tient en cinq étapes, dans cet ordre : identifier les requêtes coûteuses, lire les indicateurs globaux du serveur, ajuster les paramètres structurants, corriger requêtes et index, et vérifier que le problème vient bien de la base.
Étape 1 : activer le slow query log
Le slow query log enregistre les requêtes qui dépassent long_query_time. C'est la source de vérité : il montre ce que la base exécute réellement, pas ce que l'on suppose. Il s'active à chaud, sans redémarrage ; les connexions déjà ouvertes gardent l'ancien seuil jusqu'à leur reconnexion.
Activer le slow query log
-- À chaud, sans redémarrage (à reporter dans my.cnf ensuite)
-- SET GLOBAL ne s'applique qu'aux nouvelles connexions
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- secondes, décimales acceptées
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
-- MariaDB : plan d'exécution dans le log (sortie fichier : log_output inclut FILE)
SET GLOBAL log_slow_verbosity = 'query_plan,explain';Deux précautions. log_queries_not_using_indexes paraît utile, mais sur une base active il remplit le log de petites requêtes sans importance (une table de 20 lignes lue en entier n'est pas un problème) : à activer ponctuellement, pas en permanence. Et un seuil trop bas sur un serveur très chargé génère beaucoup d'écritures disque : commencez à 1 seconde, descendez ensuite.
Sur MariaDB, log_slow_verbosity ajoute le plan d'exécution (query_plan, explain) : table scannée en entier, table temporaire sur disque, tri sur disque. On voit directement pourquoi la requête est lente. Ces détails ne sont écrits que si log_output inclut FILE ; les statistiques moteur relèvent d'une option distincte, engine (MariaDB 10.6.15 et 10.11.5 ou plus récent).
Un log brut de plusieurs Go est illisible. pt-query-digest (Percona Toolkit) regroupe les requêtes identiques aux paramètres près et les classe par temps total consommé. Le classement compte : une requête de 50 ms exécutée 2 millions de fois par jour pèse souvent plus lourd qu'une requête de 30 secondes lancée une fois par nuit.
Agréger le log avec pt-query-digest
pt-query-digest /var/log/mysql/slow.log > digest.txtÉtape 2 : lire MySQLTuner avec recul
MySQLTuner est un script Perl open source qui lit les variables et compteurs du serveur, puis produit un diagnostic et des recommandations. Il supporte MySQL, MariaDB, Percona Server et Galera. Il ne modifie rien : il lit et commente.
Télécharger et lancer MySQLTuner
wget https://mysqltuner.pl/ -O mysqltuner.pl
# without --pass, the script prompts for the password
perl mysqltuner.pl --host 127.0.0.1 --user dbaCondition indispensable : au moins 24 heures de fonctionnement depuis le dernier redémarrage. Ses ratios reposent sur des compteurs cumulés depuis le démarrage (ou depuis le dernier FLUSH STATUS). Juste après un redémarrage, les caches sont froids et les chiffres ne veulent rien dire. Les auteurs du script le disent eux-mêmes.
Ses sections les plus utiles : l'utilisation mémoire maximale théorique (une approximation : en gros, buffers globaux plus buffers par connexion multipliés par max_connections), le taux de lecture servi par le buffer pool InnoDB, la proportion de tables temporaires créées sur disque, les connexions abandonnées, et les alertes de sécurité (comptes sans mot de passe, accès distant de root).
Ce qu'on peut suivre
- Les alertes de sécurité : comptes anonymes, mots de passe vides, root accessible à distance.
- L'alerte mémoire : si la consommation maximale théorique dépasse la RAM, le serveur risque d'être tué par le système sous charge.
- Un buffer pool nettement plus petit que les données réellement consultées.
- Les fragmentations et tables sans clé primaire qu'il signale : elles méritent d'être regardées.
Ce qu'il faut challenger
- « Augmentez
query_cache_size» : le query cache n'existe plus dans MySQL 8.0 et il est désactivé par défaut sur MariaDB depuis la 10.1.7. Sur une base qui écrit beaucoup ou très concurrente, il crée de la contention. Il ne se justifie que sur certaines charges majoritairement en lecture, à mesurer. - « Augmentez
join_buffer_size/sort_buffer_size» : ces buffers sont alloués par connexion, parfois plusieurs fois par requête. Les gonfler masque un index manquant et fait grimper la mémoire consommée. Corrigez d'abord la requête. - « Augmentez
tmp_table_size» : utile seulement si les tables temporaires sur disque viennent de requêtes légitimes. Souvent, la cause est unGROUP BYou unORDER BYsans index adapté, ou des colonnes TEXT/BLOB qui forcent le passage sur disque avec le moteur MEMORY (cas de MariaDB ; le moteur TempTable de MySQL les garde en mémoire depuis la 8.0.13). - « Augmentez
table_open_cache» : raisonnable si le compteur de tables ouvertes grimpe vite, mais vérifiez la limite de descripteurs de fichiers du système en même temps.
Étape 3 : les quelques paramètres qui comptent vraiment
innodb_buffer_pool_size
Le paramètre le plus important sur une base InnoDB : la mémoire où vivent données et index consultés. La règle « 70 à 80 % de la RAM » ne vaut que pour un serveur dédié à la base. La bonne question est : quelle part des données est lue régulièrement, et combien de mémoire reste-t-il une fois retirés le système, les buffers par connexion et les autres services ? Si le jeu de données actif tient en mémoire, les lectures ne touchent presque plus le disque.
Taille du redo log
Un redo log trop petit force InnoDB à écrire ses pages sur disque trop souvent sous forte charge d'écriture. Depuis MySQL 8.0.30, on règle innodb_redo_log_capacity, modifiable à chaud (innodb_log_file_size y est déprécié). Sur MariaDB, innodb_log_file_size reste le paramètre. Dimensionnez-le pour absorber les pics d'écriture, pas au hasard.
innodb_flush_log_at_trx_commit
À 1 (défaut), chaque commit est écrit et synchronisé sur disque : aucune transaction validée n'est perdue en cas de crash, à condition que le stockage respecte les synchronisations (et avec sync_binlog=1 si le binlog est actif). À 2, on gagne en débit d'écriture, mais une coupure de courant peut faire perdre environ une seconde de transactions, parfois davantage : ce n'est pas une borne garantie. C'est un choix métier, pas une optimisation gratuite.
max_connections
Monter max_connections pour faire disparaître l'erreur « Too many connections » traite le symptôme. Chaque connexion peut consommer ses propres buffers : 1 000 connexions simultanées peuvent épuiser la RAM. La vraie question : pourquoi autant de connexions ouvertes ? Requêtes lentes qui s'accumulent, pool de connexions mal réglé côté application, absence de proxy de connexions.
Étape 4 : requêtes et index, là où se trouve le vrai gain
Une fois les requêtes coûteuses identifiées, EXPLAIN montre le plan choisi par l'optimiseur : index utilisé ou non, nombre de lignes estimé, table temporaire, tri. EXPLAIN ANALYZE (MySQL 8.0.18+) et ANALYZE (MariaDB) vont plus loin : ils exécutent la requête et comparent l'estimation à la réalité. Un gros écart entre lignes estimées et lignes lues signale des statistiques périmées ou un index mal choisi.
Analyser une requête et repérer les index inutiles
-- MySQL 8.0.18+ : exécute la requête et mesure chaque étape
EXPLAIN ANALYZE SELECT ...;
-- MariaDB : même idée, plan réel vs estimé
ANALYZE FORMAT=JSON SELECT ...;
-- MySQL, MariaDB 10.6+ (performance_schema actif) : index sans utilisation observée
SELECT * FROM sys.schema_unused_indexes;
-- MariaDB sans performance_schema : userstat s'active à chaud,
-- les index absents de INDEX_STATISTICS après un cycle complet sont suspects
SET GLOBAL userstat = 1;
SELECT * FROM information_schema.INDEX_STATISTICS;Le sys schema, présent sur MySQL et intégré à MariaDB depuis la 10.6, fournit des vues prêtes à l'emploi : index sans utilisation observée (candidats à la suppression après un cycle d'activité complet, et si aucune contrainte n'en dépend), requêtes avec scan complet, tables les plus sollicitées. Elles s'appuient sur performance_schema, désactivé par défaut sur MariaDB : son activation demande un redémarrage. Sur une base plus ancienne, les mêmes informations se trouvent dans performance_schema, avec plus d'efforts.
Les corrections typiques : ajouter un index composite dans le bon ordre de colonnes, réécrire un OR ou une sous-requête corrélée, éviter une fonction appliquée à une colonne indexée dans le WHERE, paginer autrement qu'avec un OFFSET géant. Sur une grosse table en production, un ajout d'index se prépare : outil de modification en ligne, test sur une copie.
Étape 5 : et si ce n'était pas la base ?
- Le disque : latence d'I/O élevée, stockage réseau partagé saturé, disque qui se remplit.
iostat -xen dit souvent plus que n'importe quel ratio MySQL. - L'application : le problème « N+1 », une requête par ligne affichée, fait 500 petites requêtes rapides au lieu d'une seule. Aucune n'apparaît dans le slow query log, mais la page met 3 secondes.
- Les verrous : une transaction laissée ouverte par l'application garde ses verrous et bloque les requêtes qui ont besoin de verrous incompatibles.
SHOW ENGINE INNODB STATUSet la liste des processus montrent qui attend qui. - Le réseau et la virtualisation : CPU volé par l'hyperviseur, latence entre application et base.
Ce qu'un audit ajoute
Cette méthode suffit souvent à trouver les premiers gains. Un audit MySQL / MariaDB la déroule de façon systématique sur votre charge réelle : analyse du slow query log sur une période représentative, revue du schéma et des index, lecture de la configuration au regard de votre matériel, vérification de la réplication et des sauvegardes, avec une contre-validation Signal18 en option.
Le livrable est une liste d'actions classées par impact et par risque, pas une configuration miracle. Si vous préférez déléguer l'exploitation au quotidien, l'infogérance MariaDB / MySQL inclut ce suivi dans la durée.
Questions fréquentes
MySQLTuner est-il fiable ?
Ses mesures le sont, ses recommandations sont des pistes. Il lit des compteurs globaux sans connaître vos requêtes ni votre application. Appliquer toutes ses suggestions sans comprendre chacune peut dégrader les performances ou la stabilité, ce que ses auteurs rappellent eux-mêmes.
Combien de temps attendre avant de lancer MySQLTuner ?
Au moins 24 heures de fonctionnement depuis le dernier redémarrage, idéalement une période qui couvre un cycle d'activité complet (pics de journée, traitements de nuit). Sur un serveur fraîchement redémarré, ses ratios n'ont pas de sens.
Quelle valeur pour long_query_time ?
1 seconde est un bon point de départ en production. On peut descendre à 0,1 ou 0,5 seconde pour une analyse ponctuelle, en surveillant la taille du fichier. À 0, le seuil de durée ne filtre plus rien (d'autres réglages, comme les ordres d'administration ou min_examined_row_limit, s'appliquent encore) : utile quelques minutes, pas en continu.
Faut-il activer le query cache pour accélérer MariaDB ?
Rarement. Il n'existe plus dans MySQL 8.0 et il est désactivé par défaut dans MariaDB. Il est invalidé à chaque écriture sur la table concernée et crée de la contention dès que la base écrit beaucoup. Il peut aider certaines charges majoritairement en lecture ; dans les autres cas, un cache applicatif ou de meilleurs index sont généralement plus efficaces. À mesurer.
Votre base ralentit et vous ne savez pas par où commencer ?
L'audit analyse votre charge réelle et vous remet une liste d'actions classées par impact et par risque.
Démarrez votre projet MariaDB infogéré
Discutons de vos besoins en bases de données. Notre équipe DBA vous conseille sur l'architecture optimale pour votre cas d'usage.
RDEM Systems SAS — SIREN 820 338 671 — 5 B rue des Noyers, 95300 Pontoise