Cuando MySQLTuner recomienda «Reduce your overall MySQL memory footprint for system stability», significa que MySQL está consumiendo demasiada memoria, lo que puede afectar la estabilidad del sistema. Para mejorar el rendimiento y evitar problemas de estabilidad, se pueden seguir las siguientes estrategias:
1. Revisar el Uso de Memoria Actual
Antes de hacer cambios, es importante revisar cuánta memoria está utilizando MySQL y cómo está configurado. Ejecuta los siguientes comandos en MySQL para obtener información:
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'table_open_cache';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'query_cache_size';
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';
SHOW VARIABLES LIKE 'sort_buffer_size';
SHOW VARIABLES LIKE 'join_buffer_size';
SHOW VARIABLES LIKE 'key_buffer_size';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
2. Reducir max_connections
si es necesario
El valor max_connections define cuántas conexiones simultáneas puede manejar MySQL. Si está demasiado alto, puede provocar un alto consumo de memoria. Si el número máximo de conexiones usadas (Max_used_connections) es mucho menor que el límite establecido, puedes reducirlo.
Comprobar el uso de conexiones máximas:
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
Si el valor de Max_used_connections es, por ejemplo, 30, pero max_connections
está en 500, entonces hay un exceso de asignación de memoria.
✅ Solución: Reducir el valor de max_connections
en my.cnf
:
[mysqld]
max_connections = 100
También puedes ajustarlo en tiempo real sin reiniciar MySQL:
SET GLOBAL max_connections = 100;
3. Ajustar innodb_buffer_pool_size
Este parámetro controla la cantidad de memoria utilizada por InnoDB para almacenar datos en caché. Generalmente, debe ocupar alrededor del 60%-70% de la memoria RAM disponible en un servidor dedicado a MySQL.
Ver el valor actual:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
Si MySQL está consumiendo demasiada memoria, se puede reducir este valor en my.cnf
:
[mysqld]
innodb_buffer_pool_size = 2G # Ajustar según el tamaño de la base de datos
Si tienes múltiples bases de datos pequeñas, puedes dividir el buffer en varias instancias:
innodb_buffer_pool_instances = 2
4. Ajustar tmp_table_size
y max_heap_table_size
Cuando MySQL maneja tablas temporales grandes, almacena los datos en memoria hasta alcanzar el límite definido por tmp_table_size
y max_heap_table_size
. Si estas variables son demasiado grandes, pueden generar un alto consumo de memoria.
Ver el valor actual:
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';
Si están demasiado altas (por ejemplo, 256M o más), redúcelas en my.cnf
:
[mysqld]
tmp_table_size = 64M
max_heap_table_size = 64M
También puedes aplicarlo temporalmente:
SET GLOBAL tmp_table_size = 64M;
SET GLOBAL max_heap_table_size = 64M;
5. Ajustar table_open_cache
y table_definition_cache
Si hay demasiadas tablas abiertas, MySQL puede consumir más memoria de la necesaria.
Ver la configuración actual:
SHOW VARIABLES LIKE 'table_open_cache';
SHOW VARIABLES LIKE 'table_definition_cache';
Reducir valores si son demasiado altos:
[mysqld]
table_open_cache = 2000
table_definition_cache = 1500
Aplicar cambios en tiempo real:
SET GLOBAL table_open_cache = 2000;
SET GLOBAL table_definition_cache = 1500;
6. Ajustar los buffers de conexión (sort_buffer_size
, join_buffer_size
)
Los buffers de ordenación y combinación pueden ocupar memoria de manera significativa, especialmente cuando hay muchas conexiones activas.
Ver valores actuales:
SHOW VARIABLES LIKE 'sort_buffer_size';
SHOW VARIABLES LIKE 'join_buffer_size';
Reducir si son demasiado altos:
[mysqld]
sort_buffer_size = 2M
join_buffer_size = 2M
Aplicar cambios en tiempo real:
SET GLOBAL sort_buffer_size = 2M;
SET GLOBAL join_buffer_size = 2M;
7. Revisar query_cache_size
(Si se usa)
El query_cache_size
puede afectar el rendimiento de MySQL y generar alto uso de memoria si está activado en entornos con muchas escrituras.
Ver si está activado:
SHOW VARIABLES LIKE 'query_cache_type';
SHOW VARIABLES LIKE 'query_cache_size';
Si está activado (query_cache_type = ON
) y hay muchas escrituras en la base de datos, se recomienda desactivarlo:
[mysqld]
query_cache_type = OFF
query_cache_size = 0
Aplicar en tiempo real:
SET GLOBAL query_cache_type = OFF;
SET GLOBAL query_cache_size = 0;
8. Monitorear el Uso de Memoria en Tiempo Real
Para verificar cuánta memoria está usando MySQL en tiempo real, puedes usar:
SELECT * FROM sys.memory_global_total;
O en servidores Linux:
ps aux | grep mysqld
Para una visión más detallada, puedes usar MySQLTuner o MyTop:
mysqltuner
mytop -u root -p
Conclusión
Reducir el consumo de memoria de MySQL es clave para mejorar la estabilidad del sistema y evitar problemas de rendimiento. Los principales ajustes incluyen:
✅ Reducir max_connections si hay un exceso de conexiones no utilizadas.
✅ Ajustar innodb_buffer_pool_size para evitar sobrecargar la RAM.
✅ Limitar tmp_table_size y max_heap_table_size para evitar que MySQL use demasiada memoria en tablas temporales.
✅ Optimizar table_open_cache, table_definition_cache y query_cache_size.
✅ Ajustar los buffers de conexión sort_buffer_size y join_buffer_size para reducir el consumo innecesario.
Implementando estos cambios y monitorizando regularmente el uso de memoria, se puede optimizar el rendimiento y estabilidad de MySQL. 🚀