news 2026/10/27 2:01:17

慢查询和排查方式(查询日志 + 分析工具 + EXPLAIN)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
慢查询和排查方式(查询日志 + 分析工具 + EXPLAIN)

1. 什么是慢查询

MySQL 慢查询本质是“执行时间超过阈值的 SQL”,定位它靠慢查询日志 + 分析工具 + EXPLAIN,优化核心则是消除全表扫描、减少回表、避免排序/临时表与大事务阻塞。

MySQL 会把执行时间超过long_query_time的 SQL 记录到慢查询日志里,默认阈值是10 秒,但生产环境通常建议设为0.5~1 秒。 慢查询的危害主要有:

  • 占用 CPU、内存、I/O;

  • 持有锁时间变长,阻塞其他事务;

  • 接口响应变慢,甚至触发超时。

2. 如何开启慢查询日志

可以在my.cnf中永久配置,也可以动态开启。

[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 1 log_queries_not_using_indexes = 1

动态开启:

SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; SET GLOBAL log_queries_not_using_indexes = 'ON';

3. 慢查询日志关键字段

每条记录通常包含:

字段含义判断点
Query_time执行耗时超过阈值才会被记录
Lock_time锁等待时间占比高说明被锁阻塞
Rows_sent返回行数实际返回给客户端的数据量
Rows_examined扫描行数远大于返回行数,通常说明索引缺失或失效

如果Rows_examined很大,但Rows_sent很小,基本就是扫描了大量无用数据。

4. 怎么分析慢查询

常用三类方式:

  • mysqldumpslow:MySQL 自带工具,会把相似 SQL 归一化。

    mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
  • pt-query-digest:Percona Toolkit 工具,报告更细,适合生产排查。

    pt-query-digest /var/log/mysql/mysql-slow.log
  • SHOW FULL PROCESSLIST:看当前正在执行的 SQL,适合排查“此刻正在卡”的问题。

5. 拿到慢 SQL 后怎么定位(explain)

如何使用 EXPLAIN :

在你要分析的 SELECT 语句前,加上 EXPLAIN 关键字即可: EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件; 执行后,会返回一个结果集,里面包含了 MySQL 执行这条 SQL 的详细信息。

故先用EXPLAIN看执行计划:

EXPLAIN SELECT * FROM orders WHERE user_id = 1001 AND status = 'PAID';

重点看:

  • type:ALL是全表扫描,必须优化;

  • key:为NULL表示没走索引;

  • rows:预估扫描行数,越大越危险;

  • Extra:出现Using filesort、Using temporary通常说明有额外排序或临时表。

关键字段解读

(1)possible_keys 与 key possible_keys:MySQL 认为这条 SQL 可能会用到的索引。

key:MySQL 实际执行时真正用到的索引。 ==> 如果 key 为 NULL,说明没有使用任何索引,大概率是慢查询的原因。 如果 possible_keys 有值但 key 为 NULL,说明索引失效或优化器认为全表扫描更快。

(2)key_len表示使用的索引长度。

(3)type代表了 MySQL 在表中找到所需行的方式,性能从好到差排序为: NULL > system > const > eq_ref > ref > range > index > ALL ==》 const / eq_ref:性能最好,通常是通过主键或唯一索引查询,最多返回一行。 ref:使用普通索引进行查询。 range:范围查询,如 BETWEEN、IN、> 等。 index:扫描整个索引树,但不回表。ALL:全表扫描,性能最差,是慢查询的重灾区。

(4)Extra 包含了一些额外的优化信息,常见的有: Using where; Using Index:

最理想的情况,使用了索引,并且所需数据都在索引中,不需要回表查询。Using index condition:使用了索引,但需要回表查询数据。Using filesort / Using temporary:需要额外的排序或创建临时表,性能较差,需要重点优化。

总结:

SQL语句执行很慢,如何分析呢?

==?》 可以采用MySQL自带的分析工具EXPLAIN,即通过explain select的结果。

通过key和key_len检查是否命中了索引l(索引本身存在是否有失效的情况)

通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描

通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 2:01:15

边坡落石图像数据集 道路落石数据集 AI自然灾害预警数据集

文章目录石头行人及交通灾害YOLO目标检测数据集介绍这是什么数据集?数据集核心参数有哪些?数据集目录结构是什么样?YOLO26训练启动代码示例是什么?适合哪些使用者?石头行人及交通灾害YOLO目标检测数据集介绍 这是什么…

作者头像 李华
网站建设 2026/10/27 2:00:36

Java 面向对象编程(二):包、封装、static 关键字与代码块详解

Java SE 学习笔记 面向对象基础篇(二)前言在上一篇文章中,我们学习了 Java 面向对象的基本概念,包括类与对象、成员变量、成员方法、this关键字以及构造方法。但是随着项目规模逐渐增大,仅仅会创建对象还远远不够。我…

作者头像 李华
网站建设 2026/10/27 2:00:12

电力市场EM01 | N002 什么是电力市场?一文看懂国内电力市场底层逻辑

摘要:本文沿着国内电改时间线,从计划管理模式、两轮关键电改节点切入,通俗讲解电力商品独有的物理约束、电力市场五大交易板块、各参与主体权责,同时厘清市场对工商业企业与普通居民的影响,梳理常见认知误区&#xff0…

作者头像 李华
网站建设 2026/10/27 2:00:07

在 C# 中,单元测试聚焦于隔离验证单个方法或类的逻辑,不依赖数据库、网络等外部资源;集成测试则验证多个组件(如 API、数据库、中间件)协同工作是否正常

在 C# 中,单元测试聚焦于隔离验证单个方法或类的逻辑,不依赖数据库、网络等外部资源;集成测试则验证多个组件(如 API、数据库、中间件)协同工作是否正常。两者通常分属不同的测试项目,使用 MSTest、xUnit 或…

作者头像 李华
网站建设 2026/10/27 1:59:38

【电子通识】UV固化三防涂层过了UV灯就万事大吉了?

UV灯亮了,涂层就固化“好了”?干了这么多年硬件,我发现最容易骗过自己的就是眼睛做工程久了,会养成一种职业病:相信“过了设备”就等于“做完了” 。PCB从回流焊里出来,过了就是焊好了。从清洗机里出来&…

作者头像 李华