MySQL慢查询报警:程序员的监控与优化实战

2025年Java面试宝典:
点击获取 提取码:9b3g
为什么必须关注MySQL慢查询报警?
作为后端工程师,半夜被MySQL慢查询报警短信吵醒的经历大家都不陌生。当数据库响应时间超过阈值(比如500ms),意味着:
- 用户页面卡死
- 订单支付超时
- API响应雪崩 去年我们电商大促时就因未及时处理慢查询,直接损失百万订单量!
如何配置慢查询监控报警
步骤1:开启慢查询日志
在my.cnf中加入:
slow_query_log = ON
long_query_time = 1 # 超过1秒的查询
slow_query_log_file = /var/log/mysql/slow.log
步骤2:配置报警规则
在监控系统(如Prometheus+Grafana)设置:
- 抓取
mysql_global_status_slow_queries指标 - 当10分钟内慢查询次数 > 50 触发报警

慢查询分析三板斧
1. 定位问题SQL
用pt-query-digest分析慢日志:
pt-query-digest /var/log/mysql/slow.log
输出会按耗时排序显示TOP 10罪魁祸首
2. 解剖执行计划
对问题SQL使用EXPLAIN:
EXPLAIN SELECT * FROM orders WHERE user_id=123;
重点看:
- type列:ALL表示全表扫描(致命!)
- rows列:扫描行数超过1000需警惕
3. 索引优化实战
上周我们优化了个典型案例:
-- 优化前(耗时2.3秒)
SELECT * FROM logs WHERE create_time > '2023-01-01';
-- 优化后(耗时0.02秒)
ALTER TABLE logs ADD INDEX idx_createtime (create_time);
高级防护方案
限流熔断机制
在应用层设置规则:
- 单SQL执行超过3秒自动Kill
- 每分钟同类型慢查询超10次触发熔断
// Spring Boot示例
@Bean
public HikariConfig hikariConfig() {
HikariConfig config = new HikariConfig();
config.addDataSourceProperty("leakDetectionThreshold", "3000"); // 3秒阈值
return config;
}
慢查询防御体系

面试高频考点
最近在面试鸭返利网刷题时发现,大厂必问:
“当收到MySQL慢查询报警后,你的排查路径是什么?” 标准回答框架:
- 确认报警真实性(是否误报)
- 查看当前数据库负载(CPU/IO)
- 提取慢日志定位TOP SQL
- 分析执行计划+索引情况
- 紧急优化(加索引/改写SQL)
- 长期防护(慢查询熔断机制)
需要购买面试鸭会员的同学,通过面试鸭返利网找我可返利25元,会员题库含最新MySQL优化真题解析!
避坑指南
去年我们遇到的真实故障:
- 给varchar字段加索引未指定长度,导致索引失效
- Join查询字段字符集不匹配引发全表扫描
- 分页查询
LIMIT 10000,10未配合有序索引
建议每月做一次慢查询审计:
-- 查询索引使用情况
SELECT * FROM sys.schema_unused_indexes;
返回首页 | 获取更多数据库优化技巧


