systemadmin.es > DBA > Query cache MySQL

Query cache MySQL

Recientemente me preguntaron para optimizar una query en MySQL. Entre las muchas dudas una me llamó particularmente la atención: Me preguntó porque una misma query puede tardar unos minutos en ejecutarse y luego ser instantánea si se repite.

Por ejemplo, ejecutando una query dos veces con have_query_cache a YES:

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

mysql>

Podemos comprobar como la segunda vez que ejecutamos exactamente la misma query el tiempo es mucho menor:

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

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

mysql>

Se trata de la query cache. Esta se encarga de almacenar los resultados de las queries para responder rápido si se piden dos veces seguidas.

Se almacena en función de la cadena que se ha introducido, por lo que aunque la query sea igual, si difiere en los caracteres introducidos constará como una query diferente en la quey cache. Por ejemplo, para el caso anterior cambiamos count por COUNT y comprobamos como no se sacan los datos de la query cache:

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)

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>