2013-03-07 3 views
4

J'ai une requête de base de données lente qui s'exécute 18 secondes pour la première exécution et 4 secondes pour toute exécution ultérieure. J'essaie d'optimiser son temps d'exécution "coldstart". Mais pas en mesure de le reproduire en continu.Cache de requête de vidage MySQL

select SQL_NO_CACHE La directive n'aide pas.

Aucune des commandes ci-dessous le faire tourner 18 secondes à nouveau:

FLUSH QUERY CACHE; 
RESET QUERY CACHE; 
FLUSH TABLES; 

restart Même la base de données ne permet pas longue à nouveau.

Y a-t-il une autre commande qui vide le cache?

Le moteur de table est InnoDB.

+0

Quel est le moteur table est en question? –

+0

Le moteur de table est InnoDB –

+0

Essayez également de vider le pool de tampons innodb. D'un autre côté, pourquoi ne pas faire fonctionner la requête correctement? –

Répondre

9

Laissez-moi vous expliquer pourquoi cela n'aide pas.

Your Requirement: Ici, vous essayez de réexécuter la même requête, mais vous ne voulez la faire fonctionner qu'une première fois en nettoyant le cache. Lorsqu'une requête est exécutée, plusieurs types de cache apparaissent dans l'image. 'Query Cache' le cache le plus courant dont nous parlons, puis il y a des Caches MySQL (par exemple Innodb Buffer Pool), table_cache (au niveau MySQL & au niveau InnoDB), Caches OS, Cache Matériel. Cela empêchera la requête en cours d'exécution d'enregistrer un 'cache de requête', cela signifie que si vous réexécutez la même requête, vous n'aurez plus de 'cache de requêtes', mais d'autres caches seront présents dans l'image.

FLUSH QUERY CACHE : ce juste défragmenter le « cache de requêtes » pour mieux utiliser sa mémoire

RESET QUERY CACHE : Supprime tous les résultats de la requête de la « cache de requête », cela affecte l'habitude si vous avez utilisé « SQL_NO_CACHE », dans toutes les requêtes précédentes.

  • En plus de ce que vous essayez, peu de choses que vous pouvez essayer d'éviter ces caches.
  • MySQL Redémarrer est un must pour 'MySQL Caches' (Innodb Buffer Pool), là est la seule façon.
  • set global key_buffer_size = 0; pour rendre la taille de la mémoire tampon de clé nulle
  • set global query_cache_type = 0;
  • set global query_cache_size = 0;
  • niveau OS Cache: this post peut vous aider à
0

J'ajoute généralement une variable définie par l'utilisateur à la requête, de sorte qu'elle ignore le cache de requête. Pas sûr cependant, que vous pourriez imiter un début froid d'une telle manière.

SELECT a.* 
FROM a, (SELECT @a:=NULL) as foo; 
+0

Essayé maintenant: n'a pas aidé. –