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:
Su instancia RDS ejecute MySQL 5.7 con una versión menor del motor 20200331 o posterior.
El servicio de proxy dedicado esté deshabilitado para su instancia RDS. Para más detalles, consulte Disable the dedicated proxy service for an ApsaraDB RDS for MySQL instance.
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 |
|
|
Controla el interruptor de la caché. Valores válidos: 0 — deshabilitado (predeterminado); 1 — habilitado para todas las consultas elegibles ( |
|
|
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:
Reduzca
innodb_buffer_pool_sizeal 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.-
Establezca
query_cache_sizesegú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_sizeen el 20 % del tamaño del conjunto de resultados.Si desconoce el tamaño del conjunto de resultados: establezca
query_cache_sizeen 10% of `innodb_buffer_pool_size`.
ImportanteCuando cambie la especificación de su instancia RDS,
query_cache_sizeno se escala automáticamente. Reconfigúrelo inmediatamente después de que el cambio de especificación surta efecto. Establezca
query_cache_typeen 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 |
|
|
Número de consultas servidas desde la caché. Un valor en aumento confirma que la caché está activa. |
|
|
Número de consultas agregadas a la caché. |
|
|
Número de entradas de caché desalojadas debido a presión de memoria. Un valor alto indica que |
|
|
Número de consultas que no se almacenaron en caché (tipos de consulta no elegibles o uso de |
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.
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_STATISTICSpara identificar estas tablas y luego utilice la palabra claveSQL_CACHEconquery_cache_type = 2para almacenar en caché solo esas consultas. Para obtener detalles sobre cómo consultarTABLE_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_CACHEpor 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 |
Cargas de trabajo con uso intensivo de lecturas y cambios de datos poco frecuentes. |
|
2 |
Deshabilitado globalmente; solo almacena en caché consultas con |
Conjuntos de datos grandes, patrones de acceso impredecibles o cuando necesita control de caché a nivel de tabla. |