欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

MySQL中慢SQL的监控与优化技巧

2025年08月04日 Mysql
一、什么是慢sql?——数据库的"交通堵塞"慢sql的定义慢sql是指执行时间超过设定阈值(通常0.5-2秒)的sql语句。就像高速路上的事故车,它会阻塞整

一、什么是慢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. 关键指标解读表

指标理想值问题值优化建议
typeconst, refall添加索引
key索引名null优化查询条件
rows<1000>10000减少扫描范围
extrausing indexusing 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+

优化过程

优化效果

指标优化前优化后提升
平均响应时间4200ms35ms120倍
cpu使用率100%20%5倍资源释放
错误率15%0.1%99%下降
用户满意度差评率30%好评率95%体验升级

七、预防慢sql:最佳实践

开发规范清单

  1. 所有查询使用explain分析
  2. 避免全表扫描(type=all)
  3. 为where条件列添加索引
  4. 禁止超过3表join
  5. 事务内操作不超过5条sql
  6. 分页查询使用游标模式
  7. 批量操作代替循环操作
  8. 定期进行sql审查

持续优化流程

八、总结:慢sql优化黄金法则

优化金字塔

终极忠告

慢sql优化是"治未病"的艺术——最好的优化是在问题发生前预防!

行动指南:

  1. 立即开启慢查询日志
  2. 分析top 10慢sql
  3. 实施优化方案
  4. 建立监控告警
  5. 制定开发规范

记住:数据库优化不是一次性的任务,而是持续的过程。现在就开始你的优化之旅吧!

(本文基于mysql 8.0,部分命令在旧版本中可能不同)

以上就是mysql中慢sql的监控与优化技巧的详细内容,更多关于mysql慢sql监控与优化的资料请关注代码网其它相关文章!