在 Debian 上优化 MySQL 性能,通常要从 硬件、系统参数、MySQL 配置、表结构、SQL 语句 多个层面来做。下面我按“实用优先”的顺序给你一套完整优化思路,适合生产环境,也适合学习使用。
mysql -V
lscpu
free -h
常见组合:
swapoff -a
或调整 swappiness:
sysctl vm.swappiness=1
cat /sys/block/sda/queue/scheduler
建议:
echo deadline > /sys/block/sda/queue/scheduler
vi /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
配置文件一般在:
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 基础
innodb_buffer_pool_size = 4G # 物理内存的 60–70%
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# 连接
max_connections = 500
thread_cache_size = 100
# 查询缓存(MySQL 8 已移除)
# query_cache_type = 0
# 日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
# 表结构
innodb_file_per_table = 1
⚠️ 修改后重启:
systemctl restart mysql
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
经验值:
| 内存 | buffer_pool_size |
|---|---|
| 4G | 2G |
| 8G | 5G |
| 16G | 10G |
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
⚠️ 牺牲极端安全性,换取性能(常见生产方案)
EXPLAIN SELECT * FROM orders WHERE user_id = 10;
✅ 原则:
LIKE '%xxx%'SELECT id, name FROM users;
INT/BIGINT 替代 VARCHAR 做主键TEXT/BLOB 过多NOT NULLmysqldumpslow /var/log/mysql/slow.log
SHOW GLOBAL STATUS;
SHOW ENGINE INNODB STATUS\G;
pt-query-digestmytophtopiotop| 问题 | 解决方案 |
|---|---|
| CPU 高 | 优化慢 SQL |
| 磁盘 IO 高 | 增加 buffer_pool |
| 连接数不够 | 调大 max_connections |
| 锁等待 | 减少事务范围 |
| 内存不够 | 限制并发、减小 buffer |
✅ 使用官方 MySQL APT 源(避免 Debian 自带版本过旧)
wget https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb
✅ 定期清理 binlog:
expire_logs_days = 7
如果你愿意,可以告诉我:
我可以 直接给你一套“可直接用的 my.cnf 配置”。