温馨提示×

怎么解决Debian MySQL慢查询

小樊
41
2026-07-15 20:23:56
栏目: 云计算

在 Debian 上解决 MySQL 慢查询(Slow Query) 问题,通常可以按下面这个思路来排查和优化。我会从 定位 → 分析 → 优化 → 配置 四个方面说明。


一、确认慢查询是否已开启

1️⃣ 查看慢查询日志状态

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
  • slow_query_log = ON 才生效
  • long_query_time 默认是 10 秒(建议改成 1 或 0.5)

2️⃣ 开启慢查询日志(如未开启)

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

二、定位慢查询

1️⃣ 查看慢查询日志

less /var/log/mysql/slow.log

典型内容:

Query_time: 5.123
Rows_examined: 100000
SELECT * FROM orders WHERE user_id=10;

2️⃣ 使用 mysqldumpslow 工具(强烈推荐)

mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

参数说明:

  • -s t:按查询时间排序
  • -t 10:显示最慢的 10 条

三、分析慢查询原因(最常见)

✅ 1️⃣ 缺少索引(最常见)

EXPLAIN SELECT * FROM orders WHERE user_id = 10;

检查:

  • type = ALL → 全表扫描(危险)
  • rows 很大

✅ 解决:

CREATE INDEX idx_user_id ON orders(user_id);

✅ 2️⃣ SELECT * 导致性能差

❌ 不推荐:

SELECT * FROM orders;

✅ 推荐:

SELECT id, status, created_at FROM orders;

✅ 3️⃣ JOIN 没索引

SELECT *
FROM orders o
JOIN users u ON o.user_id = u.id;

✅ 确保:

orders.user_id
users.id

都有索引。


✅ 4️⃣ 数据量过大未分页

❌:

SELECT * FROM logs;

✅:

SELECT * FROM logs LIMIT 20 OFFSET 0;

✅ 5️⃣ 函数导致索引失效

❌:

WHERE DATE(create_time) = '2024-01-01'

✅:

WHERE create_time >= '2024-01-01'
  AND create_time < '2024-01-02'

四、MySQL 配置优化(Debian 常见)

1️⃣ 查看当前配置

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

2️⃣ 推荐基础配置(内存 2G 示例)

[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_type = 0

⚠️ MySQL 8.0 已移除 query cache


五、系统层面排查(Debian)

1️⃣ 查看系统负载

top
htop
iostat -x 1

2️⃣ 磁盘 IO 是否瓶颈

iotop

3️⃣ Debian 常见坑

  • MySQL 数据目录在 /var/lib/mysql
  • 磁盘满会导致严重慢查询
df -h

六、MySQL 8 特别说明

  • ✅ 使用 EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT ...
  • ✅ 查看执行计划更准确

七、排查顺序总结(实战)

  1. ✅ 开启慢查询日志
  2. mysqldumpslow 找最慢 SQL
  3. EXPLAIN 分析 SQL
  4. ✅ 加索引 / 改写 SQL
  5. ✅ 优化 MySQL 参数
  6. ✅ 检查系统资源

如果你愿意,可以把 慢查询 SQL + 表结构 + MySQL 版本 发出来,我可以帮你 直接分析并给出优化方案

0