Ubuntu 上优化 MySQL 速度,可以从 系统、MySQL 配置、表结构、SQL、硬件 几个方面来做。下面给你一套实战型优化清单,按优先级排序,适合大多数场景(Web / 后台服务)。
不要一上来就乱改参数。
top
htop
iotop
SHOW PROCESSLIST;
SHOW ENGINE INNODB STATUS\G
mysqltuner
✅ 先判断是:
配置文件路径:
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
innodb_buffer_pool_size = 60% ~ 70% 内存
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
示例(4G 内存服务器):
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
⚠️ 修改后重启 MySQL
sudo systemctl restart mysql
max_connections = 300
thread_cache_size = 16
table_open_cache = 2000
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
sudo systemctl restart mysql
分析慢查询:
mysqldumpslow -s t /var/log/mysql/slow.log
EXPLAIN SELECT * FROM orders WHERE user_id = 10;
✅ 建索引原则:
CREATE INDEX idx_user_status ON orders(user_id, status);
innodb_file_per_table = ON
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
✅ SSD 服务器建议开启
❌ 错误示范:
SELECT * FROM orders WHERE DATE(created_at) = '2024-01-01';
✅ 优化后:
SELECT * FROM orders
WHERE created_at >= '2024-01-01'
AND created_at < '2024-01-02';
❌ 避免:
SELECT *LIKE '%keyword%'LIMIT 100000, 20✅ 正确分页:
SELECT * FROM orders WHERE id > 100000 ORDER BY id LIMIT 20;
sudo swapoff -a
ext4 或 xfsnoatime,nodiratime
| 内存 | innodb_buffer_pool_size |
|---|---|
| 2G | 1G |
| 4G | 2.5G |
| 8G | 5G |
| 16G | 10G |
OPTIMIZE TABLE table_name;
ANALYZE TABLE table_name;
清理 binlog(防止磁盘爆):
expire_logs_days = 7
| 场景 | 优化方式 |
|---|---|
| 查询慢 | 加索引 + EXPLAIN |
| 写入慢 | 调大 innodb_log_file_size |
| 并发高 | 调大 max_connections |
| 磁盘 IO 高 | innodb_io_capacity |
| 内存不足 | 减小 buffer_pool |
你可以直接告诉我:
Ubuntu 版本 + MySQL 版本 + 内存 + 当前慢查询