5.12. La caché de consultas de MySQL

MySQL 5.0

5.12. La caché de consultas de MySQL

MySQL 5.0 Server proporciona una query cache. Cuando se usa, la query cache almacena el texto de una consulta junto con el resultado que se le envió al cliente. Si se recibe una consulta idéntica posteriormente, el servidor devuelve el resultado de la caché de consultas en lugar de parsear y ejecutar la consulta de nuevo.

La caché de consultas es muy útil en un entorno donde tiene tablas que no cambian frecuentemente y donde el servidor recibe muchas consultas idénticas. Esta es la típica situación de muchos servidores Web que generan muchas páginas dinámicas basadas en contenido de base de datos.

Nota: La caché de consultas no devuelve datos antiguos. Cuando las tablas se modifican, cualquier entrada relevante en la caché de consultas se eliminia.

Nota: La caché de consultas no funciona en un entorno donde tiene muchos servidores mysqld actualizando las mismas tablas .

Nota: La caché de consultas no se usa para comandos preparados en la parte del servidor. Si está usando este tipo de comandos preparados, considere que no se beneficiarán de la caché de consultas. Consulte Sección 24.3.4, “Sentencias preparadas de la API C”.

A continuación algunos datos de rendimiento de la caché de consultas. Estos resultados se generaron con el MySQL benchmark suite en un Linux Alpha 2 x 500MHz con 2GB RAM y 64MB de caché de consultas.

  • Si todas las consultas que está ejecutando son simples (tales como seleccionar un registro de una tabla con un registro), pero difierente de forma que las consultas no pueden cachearse, la pérdida de rendimiento por tener activa la caché de consultas es del 13%. Este puede considerarse el peor escenario posible. En el mundo real, las consultas suelen ser mucho más complicadas, así que la pérdida de rendimiento es considerablemente menor.

  • Las búsquedas para un registro en una tabla de un registro són un 238% más rápidas con la caché de consultas que sin ella. Esto puede considerarse como la mínima mejora esperada para una consulta que se cachea.

Para desactivar la caché de consultas al arrancar el servidor, ponga la variable de sistema a 0. Al desactivar el código de caché de consultas, no hay una pérdida de rendimiento evidente. Las capacidades de la caché de consultas pueden quitarse totalmente del servidor usando la opción con configure al compilar MySQL.

5.12.1. Cómo opera la caché de consultas

Esta sección describe cómo funciona la caché de consultas cuando está operacional. Sección 5.12.3, “Configuración de la caché de consultas” describe cómo controlar si está o no operacional.

Las consultas se comparan antes de parsearla, así que las siguientes dos consultas se consideran diferentes por la caché de consultas:

SELECT * FROM 
Select * from 

Las consultas deben ser exactamenten las mismas (byte a byte) para se consideradas idénticas. Además, las consultas que son idénticas pueden tratarse como diferentes por otras razones. Las consultas que usan distintas bases de datos, distintas versiones de protocolo, o distintos conjuntos de carácteres se consideran distintas consultas y se cachean por separado.

Antes que una consulta se guarde en la cache de consultas, MySQL comprueba que el usuario tenga permisos de para todas las bases de datos y tablas involucradas. Si no es el caso, el resultado cacheado no se usa.

Si un resultado de consulta se retorna desde la caché de consultas, el servidor incrementa la variable de estado , no . Consulte Sección 5.12.4, “Estado y mantenimiento de la caché de consultas”.

Si una tabla cambia, entonces todas las consultas cacheadas que usen esa tabla pasan a ser inválidas y se eliminan de la caché.Esto incluye consultas que usen tablas que mapeen las tablas cambiadas. Una tabla puede cambiarse por varios tipos de comandos, tales como , , , , , , o .

Las tablas transaccionales que se han cambiado se invalidan cuando se realiza un .

En MySQL 5.0, la caché de consultas también funciona dentro de transacciones cuando se usa tablas ,haciendo uso del número de versión para detectar si sus contenidos han cambiado.

En MySQL 5.0, las consultas generadas por vistas se cachean. Un problema con los resultados en la caché de consultas generados por vistas que no se invalidaban apropiadamente tras algunas operaciones en dichas vistas se resolvión en MySQL 5.0.3. Consulte Sección C.1.9, “Cambios en la entrega 5.0.3 (23 Mar 2005: Beta)”.

Antes de MySQL 5.0, una consulta que empezase con un comentario podía cachearse, pero no podía obtenerse de la caché. Este problema está resuelto en MySQL 5.0.

La caché de consultas funciona para consultas del tipo y . devuelve el valor correcto incluso si la consulta precedente se obtuvo de la cache debido a que el número de registros encontrados también se almacena en la caché.

Una consulta no puede cachearse si contiene cualquiera de las siguientes funciones:

con un parámetro
sin parámetros  

Una consulta tampoco se cachea bajo las siguientes condiciones:

  • Se refiere a funciones definidas por el usuario (UDFs).

  • Se refiere a variables de usuario.

  • Se refiere a las tablas en la base de datos del sistema .

  • Es cualquiera de las siguientes formas:

    SELECT ... IN SHARE MODE
    SELECT ... FOR UPDATE
    SELECT ... INTO OUTFILE ...
    SELECT ... INTO DUMPFILE ...
    SELECT * FROM ... WHERE autoincrement_col IS NULL
    

    La última forma no se cachea ya que se usa como solución de ODBC para obtener el último ID insertado. Consulte Sección 25.1.14.1, “Cómo obtener el valor de una columna en ODBC”.

  • Se usó como comando preparado, incluso sin emplear marcadores. Por ejemplo, la consulta usada aquí:

    char *my_sql_stmt = "SELECT a, b FROM table_c";
    /* ... */
    mysql_stmt_prepare(stmt, my_sql_stmt, strlen(my_sql_stmt));
    

    no se cachea. Consulte Sección 24.3.4, “Sentencias preparadas de la API C”.

  • Usa tablas .

  • No usa ninguna tabla.

  • El usuario tiene permisos a nivel de columan para cualquiera de las tablas involucradas.

5.12.2. Opciones de SELECT para la caché de consultas

Dos opciones relacionadas con la caché de consultas pueden especificarse en los comandos :

  • El resultado de la consulta se cachea si el valor de la variable de sistema es o .

  • La consulta resultado no se cachea.

Ejemplos:

SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;

5.12.3. Configuración de la caché de consultas

La variable de sistema indica si la caché de consultas está disponible:

mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

Cuando se usa un binario MySQL 5.0 estándard, este valor siempre es , incluso si el cacheo de consultas está desactivado.

Muchas otras variables de sistema controlan las operaciones de la caché de consultas. Estas pueden especificarse en un fichero de opciones o en la línea de comandos al arrancar mysqld. Las variables de sistema de la caché de consultas todas tienen nombres que empiezan con . Se describen brevemente en Sección 5.3.3, “Variables de sistema del servidor”, con información adicional de configuracion dada aquí.

Para especificar el tamaño de la caché de consulta, inicialice la variable de sistema . Ponerla a 0 desactiva la caché de consultas. El tamaño por defecto de la caché es 0; esto es, que está desactivada.

Si el tamaño de la caché de consultas es mayor que 0, la variable influye en su funcionamiento. Esta variable puede tener los siguientes valores:

  • Un valor de o evita cachear o recibir valores cacheados.

  • Un valor de o permite el cacheo excepto para aquellos comandos que empiecen con .

  • Un valor de o provoca el cacheo de sólo los comandos que empiecen con .

Inicializar con el valor la variable determina el comportamiento de la caché de consultas para todos los clientes que se conecten tras el cambio. Clientes individuales que controlan el comportamiento de la caché para su propia conexión meidante el valor de . Por ejemplo, un cliente puede desactivar el uso de la caché de consultas para sus propias consultas así:

mysql> SET SESSION query_cache_type = OFF;

Para controlar el tamaño máximo de resultados de consultas individuales que pueden cachearse, inicialice la variable variable. El valor por defecto es 1MB.

El resultado de una consulta (los datos enviados al cliente) se guardan en la caché de consulta durante la recepción del resultado. Por lo tanto los datos normalmente no se guardan en un gran paquete. La caché de consulta prepara bloques para guardar estos datos bajo demanda, así que cuando se llena un bloque, se prepara un nuevo bloque. Como la reserva de memoria es una operación costosa (lenta), la caché de consultas reserva bloques con un tamaño mínimo dado por la variable de sistema . Cuando se ejecuta una consulta, el último bloque de resultados se ajusta al tamaño actual para liberar la memoria no usada. En función del tipo de consulta que ejecute el servidor, puede encontrar útil cambiar el variable de :

  • El valor por defecto de es 4KB. Debe ser un valor adecuado para la mayoría de los casos.

  • Si tiene muchas consultas con resultados pequeños, el tamaño de bloque por defecto puede llevar a fragmentación de memoria, como se indica con un alto número de bloques libres. La fragmentación puede forzar a la caché de consultas a borrar consultas de la caché debido a la falta de memoria. En este caso, debe decrementar el valor de . El número de bloques libres y de consultas borradas debido a falta de espacio se da en las variables y .

  • Si la mayoría de las consultas tienen resultados grandes (compruebe las variables de estado y ), puede incrementar el rendimiento incrementando . Sin embargo, tenga cuidado de no hacerlo demasiado grandes (consulte el punto anterior).

5.12.4. Estado y mantenimiento de la caché de consultas

Puede comprobar si la caché de consultas está presente en su servidor MySQL con el siguiente comando:

mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

Puede defragmentar la caché de consultas para mejor uso de esta memoria con el comando . El comando no elimina ninguna consulta de la caché.

El comando elimina todos los resultados de consultas de la caché de consultas. El comando también lo hace.

Para monitorizar el rendimiento de la caché de consultas, use para ver las variables de estado de la caché:

mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_free_blocks      | 36     |
| Qcache_free_memory      | 138488 |
| Qcache_hits             | 79570  |
| Qcache_inserts          | 27087  |
| Qcache_lowmem_prunes    | 3114   |
| Qcache_not_cached       | 22989  |
| Qcache_queries_in_cache | 415    |
| Qcache_total_blocks     | 912    |
+-------------------------+--------+

Las descripicones de estas varibles se dan e Sección 5.3.4, “Variables de estado del servidor”. Algnos de sus usos se describen aquí.

El número total de consultas es igual a:

  Com_select
+ Qcache_hits
+ consultas con errores detectadas por el parser

El valor es igual a:

  Qcache_inserts
+ Qcache_not_cached
+ consultas con errores encontrados durante la comprobación de columnas/permisos

La caché de consultas usa bloques del tamaño de las variables, así y puede indicar la fragementación de memoria de la caché de consultas. Tras , sólo queda un bloque de memoria libre.

Cada consulta cacheada requiere como mínimo dos bloques (uno para el texto de la consulta y otro o más para el resultado de la misma). Además, cada tabla que se usa por una consulta requiere un bloque. Sin embargo, si dos o más consultas usan la misma tabla, sólo un bloque necesita ser reservado.

La información proporcionada por la variable de estado puede usarse para ayudarle a ajustar el tamaó de la caché de consutlas. Cuenta el número de consultas que se han eliminado de la caché para liberar memoria para cachear nuevas consultas. La caché de consultas usa una estrategia de último resultado usado (LRU) para decidir qué consultas eliminar de la caché. Información para ajustar las variables se da en Sección 5.12.3, “Configuración de la caché de consultas”.