一、什么是慢sql?——数据库的"交通堵塞"
慢sql的定义
慢sql是指执行时间超过设定阈值(通常0.5-2秒)的sql语句。就像高速路上的事故车,它会阻塞整个交通流!
慢sql的典型危害
危害类型 | 影响 | 经济损失 |
---|---|---|
用户体验 | 页面卡顿、超时 | 用户流失增加30% |
系统资源 | cpu/内存耗尽 | 服务器成本增加50% |
业务影响 | 订单丢失、支付失败 | 每分钟损失$1000+ |
团队压力 | 紧急故障处理 | 开发效率下降40% |
二、开启慢sql监控:安装"交通摄像头"
1. 配置慢查询日志
-- 查看当前设置 show variables like 'slow_query%'; show variables like 'long_query_time'; -- 动态开启(重启失效) set global slow_query_log = 'on'; set global long_query_time = 1; -- 1秒阈值 set global slow_query_log_file = '/var/log/mysql/slow.log'; -- 永久生效(my.cnf) [mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1 -- 记录无索引查询 log_output = file
2. 性能模式监控
-- 开启性能监控 update setup_consumers set enabled = 'yes' where name like '%events_statements%'; -- 查看慢sql统计 select * from events_statements_summary_by_digest where sum_timer_wait > 1000000000000; -- 查询超过1秒的sql
3. 慢查询日志格式解析
# time: 2023-10-05t08:12:34.123456z # user@host: root[root] @ localhost [] id: 15 # query_time: 5.123456 lock_time: 0.001000 rows_sent: 10 rows_examined: 100000 set timestamp=1696493554; select * from orders where status='pending' and amount > 100;
关键字段:
query_time
:sql执行时间rows_examined
:扫描行数rows_sent
:返回行数lock_time
:锁定时间
三、分析慢sql:找出"堵点"原因
1. explain命令详解
explain select * from users where age > 30 and country = 'cn';
2. 关键指标解读表
指标 | 理想值 | 问题值 | 优化建议 |
---|---|---|---|
type | const, ref | all | 添加索引 |
key | 索引名 | null | 优化查询条件 |
rows | <1000 | >10000 | 减少扫描范围 |
extra | using index | using temporary | 避免临时表 |
3. 可视化分析工具
pt-query-digest使用:
# 安装percona toolkit sudo apt install percona-toolkit # 分析慢日志 pt-query-digest /var/log/mysql/slow.log # 输出报告示例 # 220ms avg, 95% 350ms, 最大耗时2.5s # 执行次数:120次/天 # 建议:添加索引(status,amount)
四、十大慢sql优化技巧:从入门到精通
1. 索引优化:数据库的"高速公路"
-- 添加组合索引 create index idx_status_amount on orders(status, amount); -- 删除冗余索引 drop index idx_status on orders;
索引优化矩阵:
场景 | 索引策略 | 效果 |
---|---|---|
where条件 | 组合索引 | ⭐⭐⭐⭐ |
order by | 排序字段索引 | ⭐⭐⭐ |
join字段 | 外键索引 | ⭐⭐⭐⭐ |
高基数字段 | b-tree索引 | ⭐⭐⭐⭐ |
2. 查询重写:更高效的表达
-- 优化前(函数导致索引失效) select * from orders where year(create_time) = 2023; -- 优化后 select * from orders where create_time between '2023-01-01' and '2023-12-31';
3. 避免select *:精准数据获取
-- 优化前 select * from products; -- 优化后 select id, name, price from products;
4. 深度分页优化
-- 传统分页(慢) select * from orders limit 1000000, 20; -- 游标分页(快) select * from orders where id > 1000000 limit 20;
5. 批量操作:减少交互次数
// java示例:批量插入 preparedstatement ps = conn.preparestatement("insert into logs values (?)"); for (string log : logs) { ps.setstring(1, log); ps.addbatch(); // 添加到批处理 } ps.executebatch(); // 批量执行
6. 合理使用join
-- 使用exists代替join select * from users u where exists ( select 1 from orders o where o.user_id = u.id and o.amount > 1000 );
7. 控制事务大小
-- 小事务提交 start transaction; insert into ...; -- 少量操作 commit;
8. 使用覆盖索引
-- 创建覆盖索引 create index idx_cover on orders(user_id, status); -- 查询只需索引 select user_id, status from orders where user_id=100;
9. 分区表优化
-- 按时间分区 create table logs ( id int, log_time datetime ) partition by range (year(log_time)) ( partition p2020 values less than (2021), partition p2021 values less than (2022) );
10. 架构升级
五、自动化监控工具:24小时守护
工具对比表
工具 | 类型 | 功能 | 适用场景 |
---|---|---|---|
prometheus+grafana | 开源 | 可视化监控 | 云原生环境 |
mysql enterprise monitor | 商业 | 实时监控 | 企业用户 |
pt-query-digest | 命令行 | 慢日志分析 | 深度分析 |
percona monitoring and management | 开源 | 全套监控 | dba首选 |
prometheus监控配置
# prometheus.yml scrape_configs: - job_name: 'mysql' static_configs: - targets: ['mysql-server:9104'] metrics_path: /metrics
grafana仪表盘示例
六、实战案例:电商系统优化之旅
问题场景
- 订单查询超时(>5秒)
- 高峰期数据库cpu 100%
- 每分钟超时错误50+
优化过程
优化效果
指标 | 优化前 | 优化后 | 提升 |
---|---|---|---|
平均响应时间 | 4200ms | 35ms | 120倍 |
cpu使用率 | 100% | 20% | 5倍资源释放 |
错误率 | 15% | 0.1% | 99%下降 |
用户满意度 | 差评率30% | 好评率95% | 体验升级 |
七、预防慢sql:最佳实践
开发规范清单
- 所有查询使用explain分析
- 避免全表扫描(type=all)
- 为where条件列添加索引
- 禁止超过3表join
- 事务内操作不超过5条sql
- 分页查询使用游标模式
- 批量操作代替循环操作
- 定期进行sql审查
持续优化流程
八、总结:慢sql优化黄金法则
优化金字塔
终极忠告
慢sql优化是"治未病"的艺术——最好的优化是在问题发生前预防!
行动指南:
- 立即开启慢查询日志
- 分析top 10慢sql
- 实施优化方案
- 建立监控告警
- 制定开发规范
记住:数据库优化不是一次性的任务,而是持续的过程。现在就开始你的优化之旅吧!
(本文基于mysql 8.0,部分命令在旧版本中可能不同)
以上就是mysql中慢sql的监控与优化技巧的详细内容,更多关于mysql慢sql监控与优化的资料请关注代码网其它相关文章!
发表评论