Comprobar el estado de la caché de MySQL
Hace unos días hablamos de cómo activar la caché de MySQL. Espero que la hayáis probado y que hayáis visto cómo vuestros tiempo de consulta se reducen considerablemente con sólo activarla. Os dije que os comentaría cómo monitorizarla y de esa promesa, esta entrada.
Soy de los que dice que algo por bien que funcione, si no puede medirse, no funciona tan bien. Las sensaciones son esos y aunque veamos que el tiempo de ejecución ha caído, no sabemos nada sobre la caché. Todos los que hayáis estudiado algo relacionado con la informática, conoceréis conceptos como la tasa de fallos y de aciertos de cualquier caché y ésta, no podía ser menos.
¿Cómo podemos ver esos datos? Veamos.
Comprobar si la caché está activada
Para esta labor usaremos el siguiente comando (siempre desde la consola de MySQL):
SHOW VARIABLES LIKE 'have_query_cache';
Que nos devolverá si está activada lo siguiente:
+------------------+-------+ | Variable_name | Value | +------------------+-------+ | have_query_cache | YES | +------------------+-------+
Parámetros de estado
Para ver todos los parámetros del estado de la caché, una vez sabemos que está activada hacemos:
SHOW STATUS LIKE 'Qcache%';
Y el resultado es el siguiente:
+-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | Qcache_free_blocks | 3409 | | Qcache_free_memory | 501720656 | | Qcache_hits | 3265000 | | Qcache_inserts | 1321208 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 72160 | | Qcache_queries_in_cache | 10027 | | Qcache_total_blocks | 24143 | +-------------------------+-----------+
Veamos parámetro a parámetro cuál es su significado (el significado lo he buscado en la referencia de MySQL, donde aparece el significado de todas las variables del servidor):
- Qcache_free_blocks: El número de bloques de memoria libres en la cache de consultas.
- Qcache_free_memory: El total de memoria libre en la cache de consultas.
- Qcache_hits: Número de aciertos de la caché.
- Qcache_inserts: Número de consultas que han sido agregadas a la caché.
- Qcache_lowmem_prunes: Número de consultas borradas de la caché porque no había suficiente memoria.
- Qcache_not_cached: Número de consultas no cacheadas, por no ser cacheables.
- Qcache_queries_in_cache: Número de consultas registradas en la caché (no se me quedó nunca claro la diferencia con Qcache_inserts, ¿alguien la conoce?)
- Qcache_total_blocks: Número de bloques que tiene actualmente la caché de consultas.
¿Cómo medir la eficacia de nuestra caché?
Para medir la eficacia de la caché debemos hacer la siguiente fórmula para calcular el porcentaje de acierto y por lo tanto el porcentaje de consultas que en lugar de ir a buscarse a la base de datos física, se miran directamente en la caché.
El coeficiente será el siguiente: Qcache_hits/(Com_select+Qcache_hits)
¿Qué es Com_select? Este parámetro indica la cantidad de consultas SELECT que se han ejecutado fuera de la caché. Para obtenerlo ejecutamos la siguiente consulta:
show global status like 'Com_select%';
En mi caso obtengo:
+---------------+---------+ | Variable_name | Value | +---------------+---------+ | Com_select | 1371295 | +---------------+---------+
Mi tasa será por lo tanto: 3265000 / (1371295 + 3265000) = 70,42%, no está nada mal, ¿y la vuestra?