MySQL中,如何定位慢查询?定位到的慢SQL如何分析?

目录

1. 慢查询发生的场景?

2. MySQL中,如何定位慢查询?

2.1 详细解释

3. 定位到的慢SQL如何分析?

3.1 详细说明



1. 慢查询发生的场景?

2. MySQL中,如何定位慢查询?

介绍一下当时产生问题的场景(我们当时的一个接口测试的时候非常的慢,压测的结果大概5秒钟)

1..我们系统中当时采用了运维工具(Skywalking),可以监测出所有接口的执行执行时间并排序。

2.在mysgl中开启了慢日志查询,我们设置的值就是2秒,一旦sgl执行超过2秒就会记录到日志中(调试阶段开启慢查询日志,生产阶段不开启)

2.1 详细解释

3. 定位到的慢SQL如何分析?

3.1 详细说明

explain 主要用来 SQL 分析,它主要的属性详解如下:

  • id:查询的执行顺序的标识符,值越大优先级越高。简单查询的 id 通常为 1,复杂查询(如包含子查询或 UNION)的 id 会有多个。
  • select_type重要):查询的类型,如 SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)等。
  • table:查询的数据表。
  • type重要):访问类型,如 ALL(全表扫描)、index(索引扫描)、range(范围扫描)等。一般来说,性能从好到差的顺序是:const > eq_ref > ref > range > index > ALL。
  • possible_keys:可能用到的索引。
  • key重要):实际用到的索引。
  • key_len:用到索引的长度。
  • ref:显示索引的哪一列被使用。
  • rows重要):估计要读取的行数,值越小越好。
  • filtered:显示查询条件过滤掉的行的百分比。一个高百分比表示查询条件的选择性好。
  • Extra重要):额外信息,如 Using index(表示使用覆盖索引)、Using where(表示使用 WHERE 条件进行过滤)、Using temporary(表示使用临时表)、Using filesort(表示需要额外的排序步骤)。

type 详解:

  • null:表示开发中没有使用到表,这个几乎不发生,无需关注
  • system:表示查询的表只有一行(系统表)。这是一个特殊的情况,不常见。
  • const:表示查询的表最多只有一行匹配结果。这通常发生在查询条件是主键唯一索引,并且是常量比较。
  • eq_ref:表示对于每个来自前一张表的行,MySQL 仅访问一次这个表。这通常发生在连接查询中使用主键或唯一索引的情况下。
  • ref:MySQL 使用非唯一索引扫描来查找行。查询条件使用的索引是非唯一的(如普通索引)。
  • range:表示 MySQL 会扫描表的一部分,而不是全部行。范围扫描通常出现在使用索引的范围查询中(如 BETWEEN><>=<=)。
  • index:表示 MySQL 扫描索引中的所有行,而不是表中的所有行。即使索引列的值覆盖查询,也需要扫描整个索引。
  • all(性能最差):表示 MySQL 需要扫描表中的所有行,即全表扫描。通常出现在没有索引的查询条件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值