Cómo mejorar el rendimiento de MySQL usando CACHÉ

Antes de lanzarse a una investigación de rendimiento en profundidad — estadísticas de espera, planes de ejecución, benchmarks de E/S — vale la pena comprobar si un simple error de configuración está detrás del problema. Una de las mejoras rápidas más comunes y de mayor impacto en MySQL es el dimensionamiento de la caché de consultas. Una caché desactivada, demasiado pequeña o mal dimensionada puede representar una parte significativa de la latencia de las consultas en cargas de trabajo con muchas lecturas.

Nota: La caché de consultas de MySQL quedó obsoleta en MySQL 5.7.20 y fue eliminada por completo en MySQL 8.0. Si está usando MySQL 8.0+, este artículo no aplica — considere ProxySQL o caché a nivel de aplicación en su lugar.

Cómo funciona la caché de consultas de MySQL

Cuando la caché de consultas está habilitada, MySQL almacena el resultado de una consulta SELECT en memoria. Las consultas idénticas posteriores (mismo texto, mismo contexto de esquema) se sirven directamente desde memoria sin acceder al disco. Un resultado en caché se invalida en cuanto cambia cualquier dato en las tablas subyacentes.

Tres parámetros controlan el comportamiento:

  • query_cache_size — memoria total asignada a la caché. Valor predeterminado: 0 (desactivada).
  • query_cache_limit — tamaño máximo de un único resultado en caché. Los resultados mayores que este valor no se almacenan en caché.
  • query_cache_min_res_unit — tamaño mínimo del bloque de asignación. Valores más pequeños reducen la fragmentación de memoria para resultados pequeños.

Paso 1: Verificar la configuración actual

SHOW VARIABLES LIKE '%query_cache%';
-- Expected output on an enabled instance:
-- +------------------------------+----------+
-- | Variable_name                | Value    |
-- +------------------------------+----------+
-- | have_query_cache             | YES      |
-- | query_cache_limit            | 2097152  |  -- 2 MB max per result
-- | query_cache_min_res_unit     | 4096     |  -- 4 KB blocks
-- | query_cache_size             | 33554432 |  -- 32 MB total
-- | query_cache_type             | ON       |
-- +------------------------------+----------+

Paso 2: Analizar la eficacia de la caché

Después de que la instancia haya estado funcionando bajo una carga de trabajo normal durante al menos algunos días, compruebe las métricas de rendimiento de la caché:

SHOW STATUS LIKE 'QCache%';

Métricas clave a evaluar:

  • Ratio Qcache_hits / Qcache_inserts: un ratio alto significa que la caché es eficaz. Un ratio inferior a 1:1 sugiere que la mayoría de las consultas no se están beneficiando.
  • Qcache_lowmem_prunes: entradas eliminadas por presión de memoria. Un valor alto y creciente significa que query_cache_size es demasiado pequeño.
  • Qcache_not_cached: consultas que omiten la caché (consultas no almacenables como las que usan NOW(), RAND(), o funciones no deterministas).
  • Qcache_free_memory: espacio libre restante. Si este valor está consistentemente cerca de cero, aumente query_cache_size.

Configuración inicial recomendada

No existe una configuración “óptima” universal — el ajuste depende del patrón de carga de trabajo, los tamaños de los conjuntos de resultados y la frecuencia de escritura. Como punto de partida:

  • Active la caché con un tamaño moderado (32–128 MB) y monitorícela durante una semana antes de ajustarla más.
  • Mantenga query_cache_min_res_unit pequeño (4096 bytes) para reducir la fragmentación.
  • En cargas de trabajo con muchas escrituras, la caché puede perjudicar el rendimiento debido a la sobrecarga de invalidación constante — en ese caso, considere desactivarla por completo.

Para la referencia completa de parámetros: Documentación de la caché de consultas de MySQL 5.6.