Le cache de requêtes de MySQL permet d’optimiser le temps d’exécution des requêtes en lecture, à savoir les SELECT. Son efficacité est d’autant plus grande que les requêtes sont fréquentes et les résultats invariants, ce qui est majoritairement le cas pour les sites Web. Son fonctionnement est simple : la sortie texte de la requête et des résultats des requêtes est mise en cache et le serveur les récupère en cas de requête identique (comparaison caractère à caractère). En cas de modification des données,  tous les résultats associés aux tables cache sont nettoyés, ce qui entraîne sur le long terme une fragmentation des blocs mémoire du cache.

Pour vérifier que le cache est activé et ses différents paramètres de configuration :

mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
6 rows in set (0.00 sec)

Ainsi, il est parfois utile de désactiver la mise en cache :

  • pour une requête spécifique :
mysql> SELECT SQL_CACHE id, name FROM customer;
  • pour une connexion (session client) :
mysql> SET SESSION query_cache_type = OFF;

Si query_cache_type est fixée à DEMAND (valeur 2), alors la mise en cache est forcée au niveau du serveur (GLOBAL) ou client (SESSION) :

mysql> SET GLOBAL query_cache_type=2;
mysql> SET SESSION query_cache_type=2;

Un script de maintenance journalier peut se charger de défragmenter le cache :

mysql> FLUSH QUERY CACHE;

ou encore le vider :

mysql> RESET QUERY CACHE;