Todos los productos
Search
Centro de documentos

ApsaraDB RDS:Asignación real de memoria en MySQL

Última actualización: Sep 24, 2026

La memoria de una instancia RDS se divide en dos categorías: memoria compartida y memoria privada específica de sesión. La memoria compartida se asigna una sola vez al iniciar la instancia y se comparte entre todas las conexiones. La memoria privada específica de sesión se asigna por conexión bajo demanda; cada consulta activa que requiere ordenar, unir o leer datos reclama de inmediato el tamaño completo de su búfer. En escenarios de alta concurrencia, esta asignación por conexión es la causa principal de los errores de falta de memoria (OOM) y de los cambios entre instancias primarias y secundarias.

Cómo se calcula la memoria

A continuación se muestra la fórmula para estimar el uso total de memoria:

Total memory ≈ Shared memory
             + max_connections × per-session memory per connection

Componente

Parámetros

Memoria compartida

innodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + key_buffer_size + query_cache_size

Memoria por sesión

sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + binlog_cache_size + tmp_table_size

Memoria compartida

Ejecute la siguiente consulta para comprobar la asignación de memoria compartida:

SHOW VARIABLES WHERE Variable_name IN (
  'innodb_buffer_pool_size',
  'innodb_log_buffer_size',
  'innodb_additional_mem_pool_size',
  'key_buffer_size',
  'query_cache_size'
);

El resultado a continuación corresponde a una instancia de 240 MB:

+---------------------------------+-----------------+
| Variable_name                   | Value           |
+---------------------------------+-----------------+
| innodb_additional_mem_pool_size | 2097152         |
| innodb_buffer_pool_size         | 67108864        |
| innodb_log_buffer_size          | 1048576         |
| key_buffer_size                 | 16777216        |
| query_cache_size                | 0               |
+---------------------------------+-----------------+

Parámetros

Parámetro

Valor predeterminado en RDS

Descripción

innodb_buffer_pool_size

64 MB (instancia de 240 MB)

El pool de búferes de InnoDB. Almacena páginas de datos, páginas de índices, páginas de deshacer (undo), búferes de inserción, índices hash adaptativos, bloqueos y diccionarios de datos. Todas las operaciones de lectura y escritura SQL trabajan sobre este pool en lugar de los archivos físicos de datos; estos últimos se actualizan en disco más tarde mediante puntos de control. Un pool más grande mejora el rendimiento de lectura y escritura, pero prolonga el tiempo de recuperación ante fallos.

innodb_log_buffer_size

1 MB

El búfer de registros de InnoDB. Almacena los registros de rehacer (redo) antes de vaciarlos al disco. Este vaciado lo desencadena el hilo maestro cada segundo, en cada confirmación de transacción y cuando el búfer disponible cae por debajo de la mitad de su tamaño total. Un valor de 1 MB es suficiente para la mayoría de las cargas de trabajo.

innodb_additional_mem_pool_size

2 MB

Almacena las estructuras de datos internas de InnoDB. Aumente este valor si su instancia tiene una gran cantidad de tablas.

key_buffer_size

16 MB

Almacena en caché los índices de las tablas MyISAM. En estas tablas, las cachés de índices residen en key_buffer, mientras que las cachés de datos se guardan en la memoria del sistema operativo. Establezca este parámetro en 16 MB para todas las instancias RDS.

query_cache_size

0 (deshabilitado)

Almacena en caché los resultados de consultas mediante el hash de la instrucción SQL. Se encuentra deshabilitado en las instancias RDS. La caché se invalida cada vez que se modifica una tabla, por lo que no resulta adecuada para cargas de trabajo con muchas escrituras.

Memoria privada específica de sesión

A diferencia de la memoria compartida, los búferes de sesión no se preasignan durante el inicio. Cada valor de parámetro se asigna por completo en el momento en que una consulta lo necesita. Si hay muchas conexiones simultáneas, la suma de estas asignaciones puede superar la memoria available y provocar errores OOM.

Ejecute la siguiente consulta para comprobar la asignación de memoria de sesión:

SHOW VARIABLES WHERE Variable_name IN (
  'read_buffer_size',
  'read_rnd_buffer_size',
  'sort_buffer_size',
  'join_buffer_size',
  'binlog_cache_size',
  'tmp_table_size'
);

Ejemplo de resultado:

+-------------------------+-----------------+
| Variable_name           | Value           |
+-------------------------+-----------------+
| binlog_cache_size       | 262144          |
| join_buffer_size        | 262144          |
| read_buffer_size        | 262144          |
| read_rnd_buffer_size    | 262144          |
| sort_buffer_size        | 262144          |
| tmp_table_size          | 262144          |
+-------------------------+-----------------+

Parámetros

Parámetro

Valor predeterminado en RDS

Modificable en la consola

Descripción

read_buffer_size

256 KB

No

Búfer de exploración secuencial. Se lee antes de las lecturas físicas para reducir las operaciones de E/S.

read_rnd_buffer_size

256 KB

No

Búfer de exploración aleatoria. Se utiliza cuando las filas se leen en un orden específico después de explorar un índice.

sort_buffer_size

256 KB

No

Búfer de ordenamiento para las operaciones ORDER BY y GROUP BY. Si los datos por ordenar superan este tamaño, MySQL escribe una tabla temporal en disco. En Linux, configurar este valor por encima de 2 MB cambia la asignación de memoria de malloc() a mmap(), lo cual reduce la eficiencia.

join_buffer_size

256 KB

No

Búfer para operaciones de unión. ApsaraDB RDS for MySQL solo admite el algoritmo de unión de bucle anidado (nested loop join). La tabla no impulsora se almacena en este búfer para evitar la contención en el pool de búferes.

binlog_cache_size

256 KB

No

Caché del registro binario. Almacena los registros de transacciones antes de confirmarlas y los vacía al archivo de registro binario en disco después de la confirmación.

tmp_table_size

256 KB

Sí

Tamaño máximo de una tabla temporal en memoria. Si una consulta crea una tabla temporal que supera este límite, MySQL la convierte en una tabla MyISAM en disco. Si aparece el siguiente error, aumente este valor: [Err] 1114 - The table '/home/mysql/data3081/tmp/#sql_6197_2' is full

Nota: Solo tmp_table_size se puede modificar en la consola de RDS. Los demás parámetros de búfer de sesión no admiten cambios desde la consola.