对于利用explain排查分析慢SQL的实战案例,可以按照以下步骤进行。
1. 获取慢SQL
首先要获取慢SQL,即执行时间较长的SQL语句。可以在MySQL的慢查询日志中查看,也可以使用一些监控工具进行查看。获取慢SQL之后,可以通过一些工具进行格式化,让其更加可读。
2. 使用explain解析SQL
在获取慢SQL之后,接下来就是使用explain对SQL进行解析。使用explain可以查看SQL语句的执行计划,通过此计划可以知道如何执行SQL,以及每一步执行的具体情况。
EXPLAIN SELECT * FROM user WHERE name = 'test';
执行上述SQL语句会返回一个结果集,其中包含了整个SQL语句的执行计划。可以根据执行计划中的信息来看出哪些操作比较耗费时间。
3. 分析执行计划
在得到执行计划之后,需要进行分析。首先要看的是查询类型,查询类型有以下几种:All、Index、Range、Ref、Const、eq_ref、Null、system和unique。
- All:全表扫描
- Index:只扫描索引树,但可能会需要访问表数据
- Range:只扫描索引树,用于根据范围筛选数据,比如使用between、<、<=、>、>=等条件
- Ref:基于索引对其他表进行查找,返回一个或多个符合条件的行,一般会使用join语句
- Const:根据常量进行查找,一般用于primaryKey或唯一性索引字段
- eq_ref:类似Ref,区别是返回的结果只有一条
- Null:无效的或不相关的查询,如一个子查询的WHERE条件总是false
- system:针对系统表的查询
- unique:只扫描一次索引,只返回一行
查询的类型越是接近Const,查询效率越高,越是接近All,查询效率越低。
其次,可以看是否有使用索引。使用索引的话,在执行SQL的时候会遍历索引树而非全表扫描,更能提高查询效率。在执行计划中,若Extra列有Using index或Using index condition,则说明使用了索引。
最后,要查看查找每一行时所需的时间,即所需扫描行数和实际扫描行数。扫描过多行数据会导致查询变慢。
示例
示例1
EXPLAIN SELECT * FROM user WHERE age_range >= 20 AND age_range <= 30;
执行上述SQL语句后,得到以下结果:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | user | NULL | range | age_range_index | age_range_index | 4 | NULL | 1 | 100 | Using where |
- id: 查询的序号
- select_type: 查询的类型,可以是简单查询、联合查询等
- table: 此查询涉及的表
- partitions: 分区信息,不设置分区则为NULL
- type: 查询使用的类型,此处为range
- possible_keys: 可能使用的索引
- key: 实际使用的索引
- key_len: 使用的索引长度
- ref: 哪个列或常数与索引匹配
- rows: 查询时要扫描多少行数据
- filtered: 扫描得出结果的行数占比
- Extra: 额外的相关信息
该查询的type为range,即使用范围查询。可以看到possible_keys和key均为age_range_index,即使用了age_range字段的索引。rows为1,表示查找时只扫描1行数据。
示例2
EXPLAIN SELECT * FROM order WHERE user_id = 1;
执行上述SQL语句后,得到以下结果:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | order | NULL | ALL | NULL | NULL | NULL | NULL | 1000 | 10 | Using where |
该查询的type为ALL,即全表扫描。可以看到possible_keys、key和ref均为NULL,说明没有使用索引。rows为1000,表示扫描了1000行数据,效率不高。这时可以考虑在user_id字段上建立索引,以提高查询效率。
综上,在使用explain排查分析慢SQL的实战中,我们需要获取慢SQL,使用explain解析SQL,分析执行计划,这些步骤都需要进行。同时,要了解不同查询类型的区别,了解索引的使用,以及查找行数的影响。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用explain排查分析慢sql的实战案例 - Python技术站