Todos los productos
Search
Centro de documentos

ApsaraDB RDS:Fast query cache

Última actualización: Sep 03, 2026

Fast Query Cache es una caché de consultas desarrollada por Alibaba Cloud que reemplaza la caché de consultas nativa de MySQL con un diseño sin bloqueos y de alta concurrencia. Mejora significativamente las consultas por segundo (QPS) en cargas de trabajo con predominio de lecturas, y añade una sobrecarga mínima en escenarios mixtos de lectura y escritura.

Fast Query Cache solo está disponible en instancias RDS que ejecutan MySQL 5.7 con una versión menor del motor 20200331 o posterior, y requiere que el servicio de proxy dedicado esté deshabilitado.

Requisitos previos

Antes de empezar, asegúrese de que:

Funcionamiento

Una caché de consultas mejora el rendimiento al almacenar conjuntos de resultados para las consultas que cumplen ciertos criterios. Cuando se vuelve a ejecutar la misma consulta, la base de datos devuelve directamente el resultado almacenado en caché, lo que omite el análisis sintáctico SQL, la optimización y la ejecución. Esto reduce la sobrecarga de CPU y el tiempo de respuesta en consultas simples y de alta frecuencia.

¿Por qué no usar la caché de consultas nativa de MySQL?

La caché de consultas nativa de MySQL utiliza un bloqueo global en todas las operaciones de caché. Bajo alta concurrencia, este bloqueo se convierte en un cuello de botella: agregar más núcleos de CPU puede reducir las QPS en lugar de aumentarlas. Una gestión deficiente de la memoria agrava el problema, ya que se acumula fragmentación, la recuperación es lenta y las bajas tasas de aciertos provocan una degradación significativa del rendimiento. Estos problemas llevaron a MySQL a eliminar por completo la caché de consultas nativa en MySQL 8.0 y a deshabilitarla de forma predeterminada en versiones anteriores.

Cómo Fast Query Cache resuelve estos problemas

Alibaba Cloud rediseñó la caché de consultas desde cero:

Área de mejora

Cambio realizado

Concurrencia

Se eliminó el bloqueo global. Utiliza un diseño sin bloqueos con particionamiento (sharding), lo que permite un procesamiento paralelo real multinúcleo sin contención de bloqueos.

Gestión de memoria

Asigna memoria bajo demanda. Las directivas inteligentes de recuperación reducen la fragmentación y mejoran la utilización.

Directiva de caché

Supervisa la tasa de aciertos en tiempo real y ajusta dinámicamente la directiva de desalojo y el periodo de validez de la caché para evitar que las entradas obsoletas consuman recursos.

Compatibilidad con escrituras

Utiliza invalidación incremental para invalidar parcialmente solo las entradas de caché afectadas por una escritura, lo que reduce el impacto en las lecturas almacenadas en caché.

Habilitar Fast Query Cache

Fast Query Cache se controla mediante dos parámetros: query_cache_type (interruptor de encendido/apagado) y query_cache_size (asignación de memoria).

Parámetros

Parámetro

Descripción

query_cache_type

Controla el interruptor de la caché. Valores válidos: 0 — deshabilitado (predeterminado); 1 — habilitado para todas las consultas elegibles (SQL_NO_CACHE omite el almacenamiento en caché por instrucción); 2 — deshabilitado globalmente, pero SQL_CACHE habilita el almacenamiento en caché para instrucciones específicas.

query_cache_size

Memoria asignada a la caché. Valores válidos: de 0 a 10,485,760,000 bytes (debe ser múltiplo de 1,024). Unidad: bytes.

Pasos

Dado que Fast Query Cache consume memoria adicional, reconfigure primero innodb_buffer_pool_size para liberar espacio:

  1. Reduzca innodb_buffer_pool_size al 90 % de su valor actual. El 10 % que libere quedará disponible para la caché de consultas. Por ejemplo, si el valor actual es {DBInstanceClassMemory*7/10}, establézcalo en {DBInstanceClassMemory*63/100}. Para más detalles, consulte Change the size of the InnoDB buffer pool.

  2. Establezca query_cache_size según su carga de trabajo. Para obtener detalles sobre cómo modificar parámetros, consulte Modify instance parameters.

    • Si conoce el tamaño del conjunto de resultados: establezca query_cache_size en el 20 % del tamaño del conjunto de resultados.

    • Si desconoce el tamaño del conjunto de resultados: establezca query_cache_size en 10% of `innodb_buffer_pool_size`.

    Importante

    Cuando cambie la especificación de su instancia RDS, query_cache_size no se escala automáticamente. Reconfigúrelo inmediatamente después de que el cambio de especificación surta efecto.

  3. Establezca query_cache_type en 1 para habilitar Fast Query Cache. Para más detalles, consulte Modify instance parameters.

Prueba a nivel de sesión

Antes de cambiar la configuración global, pruebe Fast Query Cache en una sola conexión sin afectar a otros usuarios:

-- Enable Fast Query Cache for this session only
SET SESSION query_cache_type = 1;

-- Disable Fast Query Cache for this session only
SET SESSION query_cache_type = 0;

Comprobar el funcionamiento de la caché

Después de habilitar Fast Query Cache, ejecute la siguiente instrucción para verificar la actividad de la caché:

SHOW STATUS LIKE 'Qcache%';

Métricas clave para revisar:

Métrica

Información que proporciona

Qcache_hits

Número de consultas servidas desde la caché. Un valor en aumento confirma que la caché está activa.

Qcache_inserts

Número de consultas agregadas a la caché.

Qcache_lowmem_prunes

Número de entradas de caché desalojadas debido a presión de memoria. Un valor alto indica que query_cache_size es demasiado pequeño.

Qcache_not_cached

Número de consultas que no se almacenaron en caché (tipos de consulta no elegibles o uso de SQL_NO_CACHE).

Una caché saludable muestra un crecimiento de Qcache_hits más rápido que el de Qcache_inserts.

Pruebas de rendimiento

Las siguientes pruebas comparan las QPS en tres configuraciones sobre una instancia RDS dedicada (4 núcleos de CPU, 8 GB de memoria, 250 MB de datos de prueba con Sysbench):

  • QC-OFF: sin caché de consultas.

  • MySQL-QC: caché de consultas nativa de MySQL.

  • Fast-QC: Fast Query Cache.

Carga de trabajo de lectura con aciertos totales (tasa de aciertos del 100 %, caché de 512 MB)

Utiliza el script oltp_point_select con instrucciones POINT SELECT sobre claves primarias.

Tabla 1. QPS para consultas de lectura con una tasa de aciertos del 100 %

Número de consultas concurrentes

QC-OFF

MySQL-QC (aumento de QPS respecto a QC-OFF)

Fast-QC (aumento de QPS respecto a QC-OFF)

1

8,093

8,771 (8.38%)

9,261 (14.43%)

8

62,262

65,686 (5.50%)

75,313 (20.96%)

16

97,083

73,027 (-24.78%)

139,323 (43.51%)

32

97,337

60,567 (-37.78%)

200,978 (106.48%)

64

106,283

60,216 (-43.34%)

221,659 (108.56%)

128

107,781

62,844 (-41.69%)

231,409 (114.70%)

256

106,694

63,832 (-40.17%)

222,187 (108.25%)

512

101,733

64,866 (-36.24%)

203,789 (100.32%)

1,024

89,548

62,291 (-30.44%)

203,542 (127.30%)

全部命中

A medida que aumenta la concurrencia, las QPS de la caché de consultas nativa de MySQL caen drásticamente, hasta un 43 % con 64 subprocesos. Las QPS de Fast Query Cache continúan aumentando y superan a QC-OFF hasta en un 127 % con 1,024 subprocesos.

Carga de trabajo de lectura con alta tasa de aciertos (tasa de aciertos >80 %, caché de 512 MB)

Utiliza el script oltp_read_only con consultas de rango que devuelven varios registros.

Tabla 2. QPS para consultas de lectura con una tasa de aciertos superior al 80 %

Número de consultas concurrentes

QC-OFF

MySQL-QC (aumento de QPS respecto a QC-OFF)

Fast-QC (aumento de QPS respecto a QC-OFF)

1

5099

6467 (26.83%)

7022 (37.71%)

8

28782

28651 (-0.46%)

45017 (56.41%)

16

35333

31099 (-11.98%)

66770 (88.97%)

32

34864

27610 (-20.81%)

67623 (93.96%)

64

35503

27518 (-22.49%)

75981 (114.01%)

128

35744

27733 (-22.41%)

80396 (124.92%)

256

35685

27738 (-22.27%)

80925 (126.78%)

512

35308

27398 (-22.40%)

79323 (124.66%)

1024

34044

26861 (-22.10%)

75742 (122.48%)

高命中率

Las QPS de Fast Query Cache continúan aumentando con la concurrencia y alcanzan un pico superior al 124 % por encima de QC-OFF. La caché de consultas nativa de MySQL se degrada hasta un 22 % por debajo de QC-OFF bajo alta concurrencia.

Carga de trabajo de lectura con baja tasa de aciertos (tasa de aciertos ~10 %, caché de 16 MB)

Utiliza el script oltp_read_only. Una caché de 16 MB es mucho más pequeña que el conjunto de datos, lo que provoca desalojos frecuentes y una tasa de aciertos cercana al 10 %.

Tabla 3. QPS para consultas de lectura con una tasa de aciertos de aproximadamente 10 %

Número de consultas concurrentes

QC-OFF

MySQL-QC (aumento de QPS respecto a QC-OFF)

Fast-QC (aumento de QPS respecto a QC-OFF)

1

5,004

4,727 (-5.54%)

5,199 (3.90%)

8

28,795

22,542 (-21.72%)

28,578 (-0.75%)

16

35455

24,064 (-32.13%)

35,682 (0.64%)

32

34,526

21,330 (-38.22%)

35,871 (3.90%)

64

35,514

19,791 (-44.27%)

36,051 (1.51%)

128

35,983

19,519 (-45.75%)

36,253 (0.75%)

256

35,695

19,168 (-46.30%)

36,337 (1.80%)

512

35,182

18,420 (-47.64%)

35,972 (2.25%)

1,024

33,915

20,168 (-40.53%)

34,546 (1.86%)

低命中率

La caché de consultas nativa de MySQL pierde hasta un 48 % de QPS en condiciones de baja tasa de aciertos. Fast Query Cache se mantiene dentro de un margen de 1–4 % respecto a QC-OFF, y prácticamente no añade sobrecarga incluso cuando la mayoría de las consultas fallan en la caché.

Carga de trabajo mixta de lectura y escritura

Utiliza el script oltp_read_write con actualizaciones frecuentes de tablas que invalidan constantemente las entradas en caché.

Tabla 4. QPS para consultas de lectura y escritura

Número de consultas concurrentes

QC-OFF

Fast-QC (aumento de QPS respecto a QC-OFF)

1

4,152

4,098 (-1.30%)

8

21,359

21,195 (-0.77%)

16

26,020

25,548 (-1.81%)

32

27,595

26,996 (-2.17%)

64

29,229

28,733 (-1.70%)

128

29,265

28,828 (-1.49%)

256

29,911

29,616 (-0.99%)

512

29,148

28,816 (-1.14%)

1,024

29,204

28,824 (-1.30%)

读写混合

Fast Query Cache reduce las QPS como máximo un 2.17 % en cargas de trabajo mixtas de lectura y escritura; el mecanismo de invalidación incremental mantiene baja la sobrecarga de mantenimiento de la caché incluso bajo escrituras constantes.

Dimensionamiento de la caché

query_cache_size afecta directamente la tasa de aciertos y las QPS. La siguiente prueba muestra la relación entre el tamaño de la caché y el rendimiento en un conjunto de datos de 10 GB (100 tablas, 400,000 registros por tabla, 20 % de datos activos, 64 subprocesos concurrentes, innodb_buffer_pool_size = 6 GB):

Tabla 5. QPS con diferentes tamaños de caché

query_cache_size (MB)

QC-OFF

Tasa de aciertos de Fast-QC

Fast-QC (aumento de QPS respecto a QC-OFF)

64

98,236

22%

99,440 (1.23%)

128

98,236

45%

114,155 (16.21%)

256

98,236

72%

140,668 (43.19%)

512

98,236

82%

151,260 (53.98%)

1,024

98,236

84%

153,866 (56.63%)

2,048

98,236

87%

159,597 (62.46%)

4,096

98236

92%

169,412 (72.45%)

Observaciones clave de esta prueba:

  • Fast Query Cache nunca reduce las QPS independientemente del tamaño de la caché, incluso con una tasa de aciertos del 22 %.

  • Para consultas por clave primaria, Fast Query Cache supera a la caché de consultas nativa de MySQL con cualquier tasa de aciertos; en algunos casos, por más del 90 %.

  • Para consultas de rango y consultas con ORDER BY, Fast Query Cache ofrece un mejor rendimiento que la caché de consultas nativa de MySQL cuando la tasa de aciertos es inferior al 90 %, y ahorra recursos significativos de CPU.

El tamaño real del conjunto de resultados para esta prueba fue de 2.5 GB. Dimensionar la caché para cubrir los datos activos (20 % de 10 GB = 2 GB) requeriría aproximadamente entre 512 MB y 1 GB de query_cache_size para alcanzar una tasa de aciertos superior al 80 % en este escenario.

Importante

Asignar demasiada memoria a query_cache_size reduce la memoria disponible para el InnoDB Buffer Pool, lo que puede perjudicar el rendimiento general. Reduzca siempre innodb_buffer_pool_size proporcionalmente al aumentar query_cache_size.

Cuándo usar Fast Query Cache

Use Fast Query Cache cuando

  • Su carga de trabajo tenga un uso intensivo de lecturas y baja frecuencia de escrituras; por ejemplo, páginas de detalles de productos en comercio electrónico o consultas de informes.

  • Desee almacenar en caché tablas específicas con altas proporciones de lectura/escritura. Consulte la tabla TABLE_STATISTICS para identificar estas tablas y luego utilice la palabra clave SQL_CACHE con query_cache_type = 2 para almacenar en caché solo esas consultas. Para obtener detalles sobre cómo consultar TABLE_STATISTICS, consulte Performance Insight.

Antes de habilitar Fast Query Cache globalmente, compruebe la tasa de aciertos de su InnoDB Buffer Pool:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';

Tasa de aciertos = 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)

Si la tasa de aciertos del InnoDB Buffer Pool es inferior al 80 %, significa que el búfer ya tiene presión de memoria. Habilitar Fast Query Cache en este estado, lo cual requiere reducir innodb_buffer_pool_size, probablemente perjudicará el rendimiento. Aumente la memoria de la instancia u optimice las consultas antes de habilitar la caché.

Evite Fast Query Cache cuando

  • Cargas de trabajo con uso intensivo de escrituras: Las escrituras frecuentes causan invalidación constante de la caché, lo que añade sobrecarga con poco beneficio de almacenamiento en caché. Para sistemas de transacciones de alta frecuencia, mantenga query_cache_type = 0.

  • Requisitos de datos en tiempo real: Los resultados en caché pueden retrasarse respecto a los datos en vivo. Para casos de uso como datos de mercados financieros donde las lecturas obsoletas son inaceptables, deshabilite la caché o use SQL_NO_CACHE por consulta.

Elija el valor adecuado de query_cache_type

query_cache_type admite cambios a nivel de sesión, por lo que puede ajustar el comportamiento de la caché por conexión sin modificar la configuración global:

SET SESSION query_cache_type = 1;  -- enable for this session
SET SESSION query_cache_type = 0;  -- disable for this session

Valor

Comportamiento

Recomendado para

0

Deshabilita Fast Query Cache globalmente.

Cargas de trabajo con uso intensivo de escrituras o escenarios con tasas de aciertos muy bajas.

1

Habilita la caché para todas las consultas elegibles; use SQL_NO_CACHE para omitir instrucciones específicas.

Cargas de trabajo con uso intensivo de lecturas y cambios de datos poco frecuentes.

2

Deshabilitado globalmente; solo almacena en caché consultas con SQL_CACHE.

Conjuntos de datos grandes, patrones de acceso impredecibles o cuando necesita control de caché a nivel de tabla.

Pasos siguientes