目录
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 需要扫描表中的所有行,即全表扫描。通常出现在没有索引的查询条件中。