优化MariaDB内存使用的核心目标是平衡性能与资源占用:既通过合理分配内存提升查询效率,又避免因内存过度消耗导致系统交换(swap)或进程崩溃。以下是具体优化步骤:
MariaDB的内存使用主要由存储引擎缓冲区和临时表/排序缓冲区决定,需根据业务场景(如InnoDB/MyISAM使用比例)调整:
innodb_buffer_pool_size(InnoDB核心缓冲区)[mysqld]
innodb_buffer_pool_size = 4G
key_buffer_size(MyISAM索引缓冲区)key_buffer_size = 64M
tmp_table_size & max_heap_table_size(内存临时表大小)ORDER BY、GROUP BY、JOIN操作生成的临时表)。若临时表超过该值,会转为磁盘临时表(严重影响性能)。建议设置为16M-256M(根据查询复杂度调整),并保持两者一致。tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size & join_buffer_size(排序/连接缓冲区)
sort_buffer_size:单线程排序操作的内存缓冲区(如ORDER BY)。join_buffer_size:无索引JOIN操作的内存缓冲区。Using filesort或Using join buffer,可逐步增加(每次增加1M,观察效果)。sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size & read_rnd_buffer_size(顺序/随机读取缓冲区)
read_buffer_size:顺序扫描表时的缓冲区(如全表扫描)。read_rnd_buffer_size:随机读取表时的缓冲区(如ORDER BY ... LIMIT)。read_buffer_size = 256K
read_rnd_buffer_size = 512K
query_cache_type=0),因其在高并发写入场景下会成为瓶颈(每次写入需清空缓存)。若仍需使用,可设置为OFF并移除query_cache_size配置。query_cache_type = 0
query_cache_size = 0
performance_schema = OFF
max_connections(最大连接数)thread_handling=pool-of-threads)或使用连接池(如ProxySQL)。max_connections = 100
thread_cache_size(线程缓存数)Threads_created状态值调整,目标命中率≥90%)。thread_cache_size = 8
SELECT
( @@key_buffer_size + @@query_cache_size + @@innodb_buffer_pool_size + @@innodb_log_buffer_size +
@@max_connections * ( @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size +
@@join_buffer_size + @@binlog_cache_size + @@thread_stack ) ) / (1024 * 1024) AS MAX_MEMORY_MB;
SET GLOBAL命令临时调整参数(重启后失效):SET GLOBAL innodb_buffer_pool_size = 2G;
SET GLOBAL tmp_table_size = 128M;
# 查看MariaDB进程内存占用
top -p $(pgrep mysqld)
# 查看InnoDB缓冲池状态
SHOW STATUS LIKE 'Innodb_buffer_pool%';
# 查看临时表使用情况
SHOW STATUS LIKE 'Created_tmp%';
/etc/sysctl.conf,优化系统内存管理:vm.swappiness = 10 # 减少系统使用swap的倾向(0-100,值越小越倾向于使用物理内存)
vm.vfs_cache_pressure = 50 # 控制内核回收用于目录和inode缓存的内存的倾向(值越大,回收越积极)
应用配置:sysctl -p。buff/cache占用过高(如free -m显示buff/cache接近总内存),可手动清理(不影响正在运行的进程):sync; echo 1 > /proc/sys/vm/drop_caches # 清理页缓存
sync; echo 2 > /proc/sys/vm/drop_caches # 清理dentries和inodes
sync; echo 3 > /proc/sys/vm/drop_caches # 清理所有缓存
可编写脚本定时清理(如每2小时一次),并加入crontab:crontab -e
# 添加以下内容(每2小时执行一次)
0 */2 * * * /usr/bin/sync && /usr/bin/echo 3 > /proc/sys/vm/drop_caches
cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak)。通过以上步骤,可有效优化MariaDB在Linux上的内存使用,提升数据库性能并降低系统资源消耗。