在 Debian 上解决 MySQL 慢查询(Slow Query) 问题,通常可以按下面这个思路来排查和优化。我会从 定位 → 分析 → 优化 → 配置 四个方面说明。
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
slow_query_log = ON 才生效long_query_time 默认是 10 秒(建议改成 1 或 0.5)SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_output = 'FILE';
永久生效(推荐):
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
重启 MySQL:
systemctl restart mysql
less /var/log/mysql/slow.log
典型内容:
Query_time: 5.123
Rows_examined: 100000
SELECT * FROM orders WHERE user_id=10;
mysqldumpslow 工具(强烈推荐)mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
参数说明:
-s t:按查询时间排序-t 10:显示最慢的 10 条EXPLAIN SELECT * FROM orders WHERE user_id = 10;
检查:
type = ALL → 全表扫描(危险)rows 很大✅ 解决:
CREATE INDEX idx_user_id ON orders(user_id);
❌ 不推荐:
SELECT * FROM orders;
✅ 推荐:
SELECT id, status, created_at FROM orders;
SELECT *
FROM orders o
JOIN users u ON o.user_id = u.id;
✅ 确保:
orders.user_id
users.id
都有索引。
❌:
SELECT * FROM logs;
✅:
SELECT * FROM logs LIMIT 20 OFFSET 0;
❌:
WHERE DATE(create_time) = '2024-01-01'
✅:
WHERE create_time >= '2024-01-01'
AND create_time < '2024-01-02'
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_type = 0
⚠️ MySQL 8.0 已移除 query cache
top
htop
iostat -x 1
iotop
/var/lib/mysqldf -h
EXPLAIN ANALYZE SELECT ...
mysqldumpslow 找最慢 SQLEXPLAIN 分析 SQL如果你愿意,可以把 慢查询 SQL + 表结构 + MySQL 版本 发出来,我可以帮你 直接分析并给出优化方案。