Le système de cache de MySQL

Il y a généralement une question que l’on se pose lorsqu’on étudie MySQL. Le principe de fonctionnement  du cache MySQL et son utilisation.

Commençons par noter que  le cache de MySQL est un endroit mémoire qu'utilise MySQL pour stocker de côté les résultats de certaines requêtes SQL. Ainsi, si une requête mise en cache est redemandée au serveur, celui-ci n'aura pas besoin d'aller interroger les tables et pourra renvoyer le résultat directement depuis le cache. Ceci permet d’obtenir un gain de vitesse très élevé.

Comment l'activer ?

Normalement, le cache est activé par défaut. Nous devons tout simplement vérifier s’il est déjà activé en tapant ceci :

SHOW VARIABLES LIKE 'have_query_cache';
Si la réponse est  "YES", ça veut dire que  le système de cache est disponible. Mais cela ne veut pas dire qu'il soit actif, nuance ! Pour savoir son état, interroger la variable 'query_cache_size' :
SHOW VARIABLES LIKE 'query_cache_size'
Cette commande vous renvoi la taille du cache. Si cette taille est à 0, alors pas de cache. Sinon, le nombre indique le nombre d'octets qui est réservé au cache. Cette taille ne peut pas être inferieure à 40kb (40*1024). Maintenant il reste à vérifier le type d'activation :

SHOW VARIABLES LIKE 'query_cache_type'
    * Si = 0, alors pas de cache
    * Si = 1, le cache est activé, sauf pour les requêtes commençant par "SELECT SQL_NO_CACHE".
    * Si = 2, le cache est désactivé par défaut, et activé pour les requêtes commençant par "SELECT SQL_CACHE"

Utilisation du cache

Vous avez déjà activé le cache MySQL, Pour l’utiliser c’est simple : Ainsi si vous exécutez deux fois la même requête, la 2e fois viendra interroger le cache automatiquement.
Seul critère : les deux requêtes doivent être parfaitement identiques, à la lettre près (sensible à la casse également).
Il existe des dizaines de petites exceptions à cette règle, voyons ici quelques unes:

    * Vous utilisez une fonction demandant une date quelconque (SELECT CURTIME() ... ne sera pas mis en cache, et c'est normal)
    * Votre requête utilise des tables temporaires.
    * Votre requête n'utilise aucune table (aucun intérêt de mettre en cache)