Query cache en MySQL

MySQL dispone de una cache (query_cache) que se encarga de guardar la cadena de texto de una petición junto con su respuesta para acceder a ella posteriormente. De esta manera no tiene que volver a analizar la sentencia y ejecutarla, con el consiguiente aumento de la velocidad.

A continuación explicaremos cómo activar la cache en nuestro MySQL y ejecutaremos un ejemplo para ver los resultados.

Activando query_cache

Para activar la query_cache editamos el fichero my.cnf y añadimos lo siguiente:

[mysqld]
query_cache_type=1
query_cache_size=64M

Luego reiniciamos el servicio.

/etc/init.d/mysqld restart


Para asegurarnos que la cache está activada ejecutamos:

mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
1 row in set (0.00 sec)


Ejemplo

Ejecutamos la siguiente consulta:

mysql> select count(*), ID_CATEGORIA from ANUNCIO group by ID_CATEGORIA;
+----------+--------------+
| count(*) | ID_CATEGORIA |
+----------+--------------+
(...)
+----------+--------------+
87 rows in set (0.23 sec)

El tiempo de respuesta ha sido de 0.23 segundos.

Ahora volveremos a ejecutar la misma consulta y verificaremos que el tiempo de respuesta sea menor que el anterior:

mysql> SELECT count(*), ID_CATEGORIA from ANUNCIO group by ID_CATEGORIA;
+----------+--------------+
| count(*) | ID_CATEGORIA |
+----------+--------------+
(...)
+----------+--------------+
87 rows in set (0.00 sec)

Efectivamente, ahora el tiempo ha sido de 0.00 segundos.

La cache almacena la query en base a la cadena que se ha introducido. Si en vez de "count" escribimos "COUNT" (en mayúsculas) veremos que el tiempo de respuesta ha vuelto a aumentar:

mysql> SELECT COUNT(*), ID_CATEGORIA from ANUNCIO group by ID_CATEGORIA;
+----------+--------------+
| COUNT(*) | ID_CATEGORIA |
+----------+--------------+
(...)
+----------+--------------+
87 rows in set (0.25 sec)

Para evitar que los resultados de una query se saquen de la cache podemos indicarlo mediante SQL_NO_CACHE:

mysql> select SQL_NO_CACHE count(*), ID_CATEGORIA from ANUNCIO group by  ID_CATEGORIA;
+----------+--------------+
| COUNT(*) | ID_CATEGORIA |
+----------+--------------+
(...)
+----------+--------------+
87 rows in set (0.25 sec)