慢查询日志监控:定位性能瓶颈的第一步
以下是慢查询日志监控的核心要点及实施指南,涵盖定位原理、配置策略与优化路径:
一、慢查询日志的核心价值
- 性能瓶颈定位
- 记录执行时间超出阈值的SQL/Redis命令,直接暴露数据库操作中的耗时操作(如全表扫描、复杂连接)
- 通过分析日志中的执行时间、扫描行数、锁等待时间等指标,精准定位问题根源
- 优化优先级识别
- 高频出现的慢查询优先优化,避免资源浪费
- 未使用索引的查询强制记录(MySQL的
log_queries_not_using_indexes
参数),暴露索引缺失问题
二、配置与启用指南
MySQL 配置示例
# 开启慢查询日志 slow_query_log = ON slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 # 阈值设为1秒 log_queries_not_using_indexes = ON # 记录未走索引的查询 min_examined_row_limit = 100 # 仅记录扫描超100行的查询:ml-citation{ref="4,7" data="citationList"}
生效方式:修改
my.cnf
后重启服务,或动态设置:sql
SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1;:ml-citation{ref="4" data="citationList"}
Redis 配置示例
bash
# 设置10ms以上操作为慢查询(单位:微秒) CONFIG SET slowlog-log-slower-than 10000 CONFIG SET slowlog-max-len 1000 # 日志队列长度:ml-citation{ref="11,13" data="citationList"}
日志查看:
SLOWLOG GET 10
获取最近10条慢查询详情(含时间戳、执行时长、命令参数)
🔧 三、分析优化全流程
- 日志采集与过滤
- MySQL:用
pt-query-digest
工具解析日志,生成TOP N慢查询报告 - Redis:通过
slowlog get
结合时间戳筛选高峰时段慢操作
- MySQL:用
- 根因诊断
现象 可能原因 验证方式 全表扫描 缺失索引或索引失效 EXPLAIN
查看执行计划锁等待时间长 事务竞争或行锁冲突 检查 Lock_time
字段内存型数据库响应慢 大Key操作或网络延迟 slowlog
分析命令复杂度 - 针对性优化
- 索引优化:对
WHERE
/ORDER BY
字段添加复合索引,遵循最左前缀原则 - 查询重构:拆分复杂JOIN、避免
SELECT *
、改用分页缓存 - Redis大Key拆分:将Hash/List类型拆分为多个子Key
- 索引优化:对
四、长效监控体系
工具 | 功能 | 适用场景 |
---|---|---|
Prometheus+Grafana | 可视化慢查询趋势与峰值告警 | MySQL/Redis统一监控 |
Percona Monitoring | 关联慢查询与服务器资源(CPU/IO) | MySQL深度诊断 |
阿里云DAS | 自动分析Redis慢日志,标注风险命令 | 云环境托管服务 |
⚠️ 避坑指南:
- 生产环境避免
long_query_time=0
(会导致日志爆炸)- Redis日志存储在内存中,需定期持久化避免丢失
优化效果案例
某电商平台订单查询优化:
- 通过慢日志发现
SELECT * FROM orders WHERE user_id=? AND status='PENDING'
平均耗时2.3秒2 - 分析
EXPLAIN
显示全表扫描,添加(user_id, status)
复合索引 - 优化后查询降至10ms,并发能力提升15倍28
慢查询日志是性能优化的起点而非终点,需结合执行计划分析与资源监控形成闭环优化链路