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

mysql 

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.



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;

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


24

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

RESET QUERY CACHE

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.


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';

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;

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.