MySQL 使用内存主要分为以下几部分: - 全局缓冲池 (InnoDB Buffer Pool) - 线程级内存 (Thread Buffers) - 查询缓存 (Query Cache) - 排序缓冲区和临时表 - 其他内存区域
-- 查看当前设置
SHOW VARIABLES LIKE 'innodb_buffer_pool%';
-- 建议设置为可用物理内存的50-80%
SET GLOBAL innodb_buffer_pool_size=8G;
优化建议:
- 设置为服务器物理内存的50-80%
- 考虑使用innodb_buffer_pool_instances
(通常设置为4-8)来减少争用
- 启用innodb_buffer_pool_dump_at_shutdown
和innodb_buffer_pool_load_at_startup
加速预热
-- 查看线程相关内存设置
SHOW VARIABLES LIKE '%thread%';
SHOW VARIABLES LIKE '%sort%';
SHOW VARIABLES LIKE '%join%';
关键参数:
- sort_buffer_size
(建议2-8MB)
- join_buffer_size
(建议2-8MB)
- read_buffer_size
(建议1-4MB)
- read_rnd_buffer_size
(建议1-4MB)
- thread_stack
(默认256KB通常足够)
-- 查询缓存状态
SHOW VARIABLES LIKE 'query_cache%';
SHOW STATUS LIKE 'Qcache%';
优化建议:
- 对于写密集型应用,考虑禁用查询缓存(query_cache_size=0
)
- 如果使用,query_cache_size
通常不超过256MB
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';
优化建议:
- 将tmp_table_size
和max_heap_table_size
设置为相同值(通常32-64MB)
- 监控Created_tmp_disk_tables
和Created_tmp_tables
状态
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
优化建议:
- 合理设置max_connections
(通常100-300)
- 使用连接池减少连接数
- 监控Threads_connected
和Aborted_connects
SHOW ENGINE INNODB STATUS;
SHOW STATUS;
SHOW VARIABLES;
-- 启用性能模式
SELECT * FROM performance_schema.setup_instruments;
SELECT * FROM performance_schema.memory_summary_global_by_event_name;
- MySQL Workbench - Percona PMM - Prometheus + Grafana
内存分配策略:
jemalloc
或tcmalloc
替代默认的内存分配器NUMA架构优化:
# 启动MySQL时使用numactl
numactl --interleave=all mysqld
交换空间预防:
# 确保swappiness设置为低值
echo 1 > /proc/sys/vm/swappiness
透明大页禁用:
# 在/etc/rc.local中添加
echo never > /sys/kernel/mm/transparent_hugepage/enabled
内存泄漏:
resident memory
随时间增长情况OOM Killer杀死MySQL:
/var/log/messages
性能突然下降:
sort_merge_passes
和created_tmp_disk_tables
通过以上优化措施,可以显著提高MySQL的内存使用效率,减少磁盘I/O,提升整体性能。