一、优化系统级内存配置
ulimit -n 65535临时生效,或修改/etc/security/limits.conf添加* soft nofile 65535; * hard nofile 65535永久生效。vm.swappiness(交换分区使用倾向)和vm.vfs_cache_pressure(内核回收用于目录和inode缓存的内存的倾向),减少内存交换对数据库性能的影响。执行sysctl -w vm.swappiness=10(值越低越避免使用交换分区)、sysctl -w vm.vfs_cache_pressure=50(值越高越积极回收缓存),并将这些设置添加到/etc/sysctl.conf中永久生效。二、调整MariaDB内存参数
innodb_buffer_pool_size是InnoDB存储引擎缓存数据和索引的关键内存区域,直接影响数据库性能。建议设置为服务器总内存的50%-75%(专用数据库服务器),若服务器还需运行其他应用(如Web服务),则设置为总内存的15%-25%。例如,8GB内存的专用服务器可设置为innodb_buffer_pool_size = 6G。query_cache_size用于缓存SELECT查询结果,但在高并发写入场景下会成为性能瓶颈(新版本MariaDB已弃用)。若应用以读为主且查询重复率高,可启用并设置为64M-256M;若写入频繁,建议设置为0关闭。同时设置query_cache_type = 1(启用)。tmp_table_size和max_heap_table_size控制内存中临时表的最大大小,超过则转为磁盘临时表(影响性能)。建议两者设置为相同值(如128M),并根据应用场景调整(如大量ORDER BY/GROUP BY操作需增大)。sort_buffer_size(排序操作内存)、join_buffer_size(表连接内存)分别控制排序和连接操作的内存使用。建议初始设置为2M-4M,若出现大量排序/连接操作导致内存不足,可逐步增加(需避免设置过大导致内存耗尽)。thread_cache_size缓存空闲线程,减少线程创建/销毁的开销。建议设置为8-16(根据并发连接数调整,可通过SHOW STATUS LIKE 'Threads_created'监控,若值持续增长则需增大)。三、定期维护与监控
OPTIMIZE TABLE命令整理表碎片,释放未使用的空间(尤其适用于频繁更新的InnoDB表)。可通过mysqlcheck --optimize --all-databases批量优化所有表。binlog)和慢查询日志,避免日志文件占用过多磁盘空间。可通过PURGE BINARY LOGS BEFORE '2025-10-01 00:00:00'删除指定时间前的二进制日志,或在my.cnf中设置expire_logs_days = 7自动过期。SHOW VARIABLES(查看参数设置)和SHOW STATUS(查看运行状态)命令监控内存使用情况。例如:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; 查看InnoDB缓冲池大小;SHOW STATUS LIKE 'Innodb_buffer_pool_pages_data'; 查看缓冲池中已使用的数据页数;SHOW STATUS LIKE 'Innodb_buffer_pool_pages_free'; 查看缓冲池中空闲的数据页数。Prometheus+Grafana、Zabbix等工具实时监控MariaDB的内存使用率、查询响应时间、连接数等指标,及时发现内存瓶颈(如缓冲池命中率低、临时表过多)。四、其他优化建议
EXPLAIN分析查询计划,避免全表扫描(如未使用索引的WHERE条件)、子查询(可改用JOIN替代)、SELECT *(仅选择需要的列)等低效操作。slow_query_log = 1和long_query_time = 1(记录执行时间超过1秒的查询)开启慢查询日志,定期分析并优化慢查询(如添加索引、重写SQL)。