MySQL - forcer de ne pas utiliser le cache pour tester la vitesse de requête

343

Je teste la vitesse de certaines requêtes dans MySQL. La base de données met en cache ces requêtes, ce qui rend difficile pour moi d'obtenir des résultats fiables lors du test de la rapidité de ces requêtes.

Existe-t-il un moyen de désactiver la mise en cache pour une requête?

Système: MySQL 4 sur l'hébergement web Linux, j'ai accès à PHPMyAdmin.

Merci


la source

Réponses:

527

Essayez d'utiliser l' option SQL_NO_CACHE (MySQL 5.7) dans votre requête. (Les utilisateurs de MySQL 5.6 cliquent ICI )

par exemple.

SELECT SQL_NO_CACHE * FROM TABLE

Cela empêchera MySQL de mettre en cache les résultats, mais sachez que d'autres caches de système d'exploitation et de disque peuvent également affecter les performances. Ce sont plus difficiles à contourner.

Jarod Elliott
la source
5
Documentation
Salman von Abbas
4
Un bel article sur le cache de requêtes mysql. Comment configurer et voir le cache en action! Vaut la lecture. databasejournal.com/features/mysql/article.php/3110171/…
Adrian P.
1
Avant d'essayer d'améliorer les performances, essayez de redémarrer votre serveur mysql. Il se peut qu'un processus affecte tout. C'est arrivé avec moi. Bien qu'il s'agisse d'un commentaire sans lien direct avec le problème, il peut aider de nombreuses personnes.
dellasavia
2
Cela l'empêche de mettre en cache les résultats, mais cela l'empêche-t-il également d' utiliser le cache?
Brett
3
@Brett voit le commentaire de SalmanPK en 2011. Cette page doc est littéralement 4 phrases et répond directement à votre question. Dans le cas où la page serait supprimée à l'avenir: "Il ne vérifie pas le cache de requête pour voir si le résultat est déjà mis en cache, ni ne met en cache le résultat de la requête."
maurice
121

Une autre alternative qui affecte uniquement la connexion actuelle:

SET SESSION query_cache_type=0;
John Carter
la source
Ma faute. C'est ce que query_cache_sizeje regardais, non query_cache_type. Je confondais la vôtre et la réponse de SeniorDev.
Mike
30

Il existe également une option de configuration: query_cache_size = 0

Pour désactiver le cache de requête au démarrage du serveur, définissez la variable système query_cache_size sur 0. En désactivant le code de cache de requête, il n'y a pas de surcharge notable. Si vous créez MySQL à partir de la source, les capacités du cache de requêtes peuvent être entièrement exclues du serveur en appelant configure avec l'option --without-query-cache.

Voir http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

Barbushin
la source
24

Vous pouvez également exécuter la commande follow pour réinitialiser le cache de requêtes.

RESET QUERY CACHE
djt
la source
9
C'est probablement exagéré ... idéalement, vous voulez seulement que MySQL ignore temporairement le cache.
BMiner
3
Vous avez également besoin d'autorisations spéciales pour cela.
Erick Robertson
19

Un problème avec le

SELECT SQL_NO_CACHE * FROM TABLE

est qu'elle semble empêcher uniquement la mise en cache du résultat de votre requête. Cependant, si vous interrogez une base de données qui est activement utilisée avec la requête que vous souhaitez tester, d'autres clients peuvent mettre en cache votre requête, affectant vos résultats. Je continue à rechercher des moyens de contourner ce problème, modifierai ce message si j'en trouve un.

wbharding
la source
1
Mais si votre cache est rempli par d'autres, vous aurez l'illusion d'être rapide. Mais parfois non.
karatedog
14

J'utiliserais ce qui suit:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';
Sergio Costa
la source
3

L'utilisation d'une variable définie par l'utilisateur dans une requête rend la requête impossible à mettre en cache. Je l'ai trouvé un bien meilleur indicateur que l'utilisation SQL_NO_CACHE. Mais vous devez placer la variable à un endroit où le réglage de la variable n'affecterait pas sérieusement les performances:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;
newtover
la source
3
"J'ai trouvé que c'était un bien meilleur indicateur que l'utilisation SQL_NO_CACHE." Comment? Il semble que vous auriez besoin d'un argument assez solide pour utiliser un piratage obscur sur un mot clé explicite, à moins que le mot clé explicite ne fasse pas ce qu'il prétend.
Air
1
@Air J'ai également trouvé que cette solution fonctionnait mieux que SQL_NO_CACHE. SQL_NO_CACHE a fonctionné pour la première fois en exécutant la requête, mais ensuite cela n'a plus fonctionné. Je suppose que cela est dû à d'autres mécanismes de mise en cache. Je pense que cela fonctionne mieux car une recherche qui repose sur une variable ne peut pas être mise en cache par une couche ou un mécanisme - du moins, c'est ma meilleure supposition.
Klik
2

Si vous souhaitez désactiver le cache de requête, définissez 'query_cache_size' sur 0 dans votre fichier de configuration mysql. Si son ensemble 0 mysql n'utilisera pas le cache de requête.

Jinesh
la source