1. 找到MySQL配置文件
Debian系统中MySQL的主配置文件通常位于/etc/mysql/my.cnf(部分版本可能为/etc/mysql/mysql.conf.d/mysqld.cnf)。可通过以下命令快速定位:
sudo find / -name my.cnf 2>/dev/null
找到文件后,使用文本编辑器(如nano或vim)打开:
sudo nano /etc/mysql/my.cnf
2. 核心内存参数设置(关键优化项)
innodb_buffer_pool_size)这是InnoDB存储引擎的核心内存区域,用于缓存表数据和索引,直接影响数据库读写性能。建议设置为物理内存的50%-80%(需预留足够内存给系统和其他进程)。例如,16GB物理内存可设置为8GB-12GB:
[mysqld]
innodb_buffer_pool_size = 8G
注:InnoDB是MySQL默认存储引擎,若未使用MyISAM,可将更多内存分配给该参数。
key_buffer_size)仅适用于使用MyISAM存储引擎的表(如全文索引表),用于缓存索引数据。若数据库主要使用InnoDB,可将其设置为64MB以下(避免浪费内存):
key_buffer_size = 64M
tmp_table_size & max_heap_table_size)控制内存中临时表的最大大小(如GROUP BY、ORDER BY、JOIN等操作生成的临时表)。若临时表超过该值,MySQL会将其写入磁盘,严重影响性能。建议两者设置为相同值(如64MB-256MB,根据查询负载调整):
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size & join_buffer_size)分别用于排序操作(如ORDER BY)和表连接(JOIN)的内存分配。默认值(通常为1-2MB)可能不足,可根据查询复杂度适当增加(如2MB-8MB),但需避免设置过大(每个连接都会占用该内存):
sort_buffer_size = 4M
join_buffer_size = 4M
query_cache_size & query_cache_type)MySQL 5.7及以上版本建议关闭查询缓存(因其在高并发环境下会成为瓶颈,且默认已禁用)。若需启用,可设置小容量(如32MB-64MB):
query_cache_size = 0  # 关闭(推荐)
query_cache_type = 0  # 关闭(推荐)
注:仅在读密集型、低并发场景可尝试启用(如
query_cache_size=64M),但需通过SHOW STATUS LIKE 'Qcache%'监控命中率。
max_connections)限制同时连接到MySQL的客户端数量,过多连接会导致内存耗尽。建议根据应用需求设置(如50-500),并结合thread_cache_size(缓存线程,减少线程创建开销)调整:
max_connections = 200
thread_cache_size = 50
3. 保存配置并重启MySQL
编辑完成后,保存文件并退出编辑器(nano中按Ctrl+O保存,Ctrl+X退出)。重启MySQL服务使配置生效:
sudo systemctl restart mysql  # Debian 9及以上版本
# 或(旧版本)
sudo service mysql restart
4. 验证配置是否生效
通过以下命令检查参数是否设置成功:
# 查看全局变量(需登录MySQL)
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'key_buffer_size';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'tmp_table_size';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_connections';"
# 查看MySQL状态(系统层面)
sudo mysqladmin -u root -p status
5. 内存使用监控与优化建议
htop(实时查看内存占用)、free -h(查看内存使用情况)、vmstat 1(监控内存交换情况);performance_schema(详细监控内存分配,如SELECT * FROM performance_schema.memory_summary_global_by_event_name;)、mysqltuner(第三方脚本,提供内存优化建议)。sudo swapoff -a临时禁用,或修改/etc/fstab永久禁用;systemd或cgroup限制MySQL进程的内存使用(如systemctl set-property mysql MemoryMax=8G);OPTIMIZE TABLE整理表碎片(减少内存占用);SELECT *(仅查询所需列)、为高频查询列添加索引(减少全表扫描)、合理使用JOIN(避免过多表关联)。