Désactiver le cache MySQL pour tester les performances

Août 2013

Le serveur de base de données MySQL est doté d'un système de cache qui permet de stocker le résultat de certaines requêtes SQL de manière à éviter de devoir parcourir les données à nouveau pour répondre à la requête.

Ce système de cache permet d'améliorer les performances en diminuant le temps d'exécution des requêtes de plus de 60%.

Le problème c'est que ce système de cache est gênant lorsqu'on souhaite optimiser une requête, car il masque une éventuelle lenteur sur une requête non optimisée.

Donc lorsqu'on optimise une requête SQL (avec EXPLAIN ou DESCRIBE pour voir les index utilisés lors des jointures), il est judicieux de désactiver le cache pour pouvoir observer les performances réelles de la requête, en forçant MySQL à recalculer la requête à chaque exécution.

Pour éteindre le cache MySQL il y a plusieurs solutions :

Variable query_cache_size

C'est la méthode la plus simple pour désactiver le cache, en réduisant la taille du cache à 0 dans la configuration du serveur MySQL. Le nom de la variable à modifier est : query_cache_size et la requête à exécuter est la suivante :

SET @@global.query_cache_size = 0;

Cette solution est conseillée dans la documentation officielle MySQL : http://dev.mysql.com/doc/refman/5.1/en/query-cache.html.

Après avoir lu formule pour comparer 2 cellules excel vous en saurez d'avantage sur ce sujet.

SELECT SQL_NO_CACHE

Voilà une seconde solution beaucoup plus simple à mettre en oeuvre, cette méthode ne désactive pas le cache de façon permanente, mais seulement pour la requête en cours. C'est très utile pour tester sur un serveur de production par exemple, ou lorsqu'on n’a pas les droits admin sur le serveur.

Le principe est extrêmement simple : il suffit d'ajouter le mot clé SQL_NO_CACHE après SELECT comme dans cet exemple :

SELECT SQL_NO_CACHE qac.*, IFNULL(SUM(v.value), 0) AS _score, u.username, u.email , NULL AS _user_vote 
FROM sc_post qac
LEFT JOIN sc_vote v ON v.post_id = qac.id
LEFT JOIN sc_user u ON u.id = qac.user_id
WHERE ( qac.dnz_parent_question = '6010')
GROUP BY qac.id
ORDER BY qac.`type` ASC, IF(qac.`type` = 'C', qac.created, NULL) ASC, qac.resolved DESC, _score DESC;

Compiler mysql avec --without-query-cache

La dernière solution, la plus radicale (à utiliser seulement si vous êtes sous Linux ou UNIX), c'est de recompiler MySQL avec l'option --without-query-cache pour exclure le module de cache de mysql.

Découvrez ce tutoriel photoshop : retoucher un visage à lire tout de suite !

0 commentaire
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré