web-dev-qa-db-fra.com

Quand utiliser SQL_NO_CACHE

Je suis en train de parcourir mes requêtes et je lis des articles sur la façon dont vous devriez utiliser SQL_NO_CACHE dans les requêtes SELECTname__. Cela m'a confondu parce que chaque article à la fin a une conclusion différente sur le moment d'utiliser ceci. Un blog que j'ai lu m'a dit que vous devriez l'utiliser si vous avez des requêtes identiques et que vous êtes unique. Sur un autre blog, j'ai lu que vous devriez l'utiliser quand vous devez extraire des informations qui ne changent jamais.

Quelqu'un peut-il expliquer quand est une bonne pratique d'utiliser cela? Je sais que cela a déjà été demandé, mais la lecture de nombreux articles n'a pas aidé, en particulier lorsque les gens disent d'utiliser cette méthode dans différentes situations. J'ai créé des situations théoriques. Quelqu'un peut-il me dire s'il est avantageux d'utiliser SQL_NO_CACHE? Merci et je m'excuse pour une question répétée. Je suis juste vraiment confus.

  1. Dites à un site Web de stocker sa configuration (c'est-à-dire nom du site, description du site, mots-clés), et une requête est créée sur chaque page pour extraire ces informations, comme requis sur chaque page.

  2. Vous sélectionnez un userIDlors d'un contrôle de connexion, la requête s'exécute uniquement pendant le processus de contrôle de connexion.

  3. Vous sélectionnez des données dans la table a_ pour mettre à jour un champ dans la table b, devez-vous utiliser SQL_NO_CACHE dans la sélection pour la table aname__?

Je vous remercie.

18
user2738336

SQL_NO_CACHE


Ajoutez simplement SQL_NO_CACHE après la partie SELECT de l’instruction SELECT et avant la liste des champs. La première requête ci-dessous utilisera le cache de requête s'il est activé et si la requête est mise en cache:

SELECT * FROM table WHERE search= 'keyword'; //lets take 1ms

La seconde requête ci-dessous n'utilisera pas le cache de requête:

SELECT SQL_NO_CACHE * FROM table WHERE search= 'keyword'; //lets take ~0.2ms at 2nd time

Ceci est particulièrement utile lors de l'analyse comparative d'une requête. Si le cache de requête est activé bien que la première requête puisse prendre un certain temps, la seconde requête et les requêtes suivantes sont presque instantanées. Avec l'utilisation de SQL_NO_CACHE, vous pouvez être assuré que le cache de requête n'est pas utilisé et que vous pouvez comparer en toute sécurité les temps de résultat. L'indicateur SQL_NO_CACHE désactive le mécanisme de mise en cache de requête intégré de MySQL pour une requête particulière. Vous pouvez aider MySQL à rendre le cache de requêtes plus efficace en utilisant cet indice pour les requêtes très dynamiques (telles qu'une recherche par mot-clé ou un rapport ne s'exécutant que de nuit). Assurez-vous que la mise en cache des requêtes est activée, sinon, il est activé. n'est pas nécessaire pour cette commande.

Qu'est-ce que SQL_CACHE et SQL_NO_CACHE?

Les options SQL_CACHE et SQL_NO_CACHE affectent la mise en cache des résultats de la requête dans le cache de la requête. SQL_CACHE indique à MySQL de stocker le résultat dans le cache de la requête s'il peut être mis en cache et que la valeur de la variable système query_cache_type est 2 ou DEMAND. Avec SQL_NO_CACHE, le serveur n'utilise pas le cache de requêtes. Il ne vérifie pas non plus le cache de la requête pour voir si le résultat est déjà mis en cache, ni le cache du résultat. (En raison d'une limitation de l'analyseur, un caractère d'espacement doit précéder et suivre le mot clé SQL_NO_CACHE; un non-espace tel qu'une nouvelle ligne amène le serveur à vérifier le cache de la requête pour voir si le résultat est déjà mis en cache.) 

À mon avis, NO_CACHE peut être utilisé si 'CACHE' est activé et que les données de la base de données sont mises à jour de manière dynamique, c'est-à-dire que le cache de données de base de données ne peut pas être utilisé, par exemple: le stockage du mot de passe de l'utilisateur est impossible possibilité de changement de données

Mises à jour de scénarios utiles


1) force à ne pas utiliser le cache pour tester la vitesse de la requête

8
7-isnotbad

Pour répondre à votre question, vous devez d’abord comprendre le fonctionnement du cache de requêtes MySQL. Un très bon article à ce sujet peut être trouvé ici . L'un des aspects clés est que le cache est synchronisé avec les données :

Le cache de requêtes ne renvoie pas de données obsolètes. Lorsque les tables sont modifiées, Toutes les entrées pertinentes du cache de la requête sont vidées.

Dans vos cas d'utilisation, je ne trouve aucune raison de ne pas utiliser le cache de requêtes avec SQL_NO_CACHE. Il y a des raisons comme profiler ou éviter d'écrire des données volumineuses dans un cache de requêtes limité pour utiliser cette option, mais je ne vois pas cela comme cela.

4
Bjoern

Le moment le plus évident pour lequel je choisirais de supprimer la mise en cache est lorsque je ne veux pas que les résultats de la requête soient stockés dans le cache (évidemment?). 

Si je n'exécute qu'une requête une seule fois, il ne sert à rien de déplacer les données actuellement dans le cache pour laisser de la place aux données qui ne seront jamais extraites du cache.

Le deuxième scénario est celui dans lequel je souhaite exécuter une requête à faible priorité - par exemple. générer un rapport ou une sauvegarde partielle - lorsque les performances de ma requête ne sont pas importantes, mais il est également important qu'elles perturbent le moins possible les autres éléments de la base de données (il existe certains problèmes de conflit pour l'accès au cache).

Un troisième scénario concerne les lots de simples requêtes de sélection de table unique renvoyant de très petits ensembles de données (par exemple, à l'aide d'ORM trivial). Dans ce scénario, la mise en cache des requêtes sera probablement plus lente que son contournement - le SGBD prendra plus de temps à gérer le cache de requêtes qu'à la lecture des données du pool de mémoire tampon/cache système.

Comme le dit Tot, le cache faussera tout profilage/benchmarking - mais le cache de requête n'est pas le seul endroit où les données sont mises en mémoire tampon/en cache.

Vous sélectionnez des données de la table a afin de mettre à jour un champ de la table b, devez-vous utiliser SQL_NO_CACHE sur la sélection pour la table a?

Non. Le cache est automatiquement invalidé lorsque les données sous-jacentes sont modifiées (d'où provient en grande partie le coût des requêtes simples).

4
symcbean

La seule fois que je l'utilisais était lors du profilage de requêtes (EXPLAIN extended...).

Lorsque vous exécutez une requête plusieurs fois (une étape très importante pour "réchauffer" le serveur), celle-ci sera mise en cache et le profileur affichera des résultats erronés.

En fonction de la situation, j'utilise aussi:

SET SESSION query_cache_type = OFF

1
Toto