SQL执行计划分析的时候,要关注哪些信息?

mysql> explain select * from actor;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | actor | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+

一个执行计划中,共有12个字段,每个字段都挺重要的,先来介绍下这12个字段
1.id:执行计划中每个操作的唯一标识符。对于一条查询语句,每个操作都有一个唯一的id。但是在多表join的
时候,一次explain中的多条记录的id是相同的。

2.select_type:操作的类型。常见的类型包括SIMPLE、PRIMARY、SUBQUERY、UNION等。不同类型的操
作会影响查询的执行效率。

3.table:当前操作所涉及的表。

4.partitions:当前操作所涉及的分区

5.type:表示查询时所使用的索引类型,包括ALL、index、range、
ref、eq ref、const、system等

6.possible keys:表示可能被查询优化器选择使用的索引。

7.key:表示查询优化器选择使用的索引。

8.key len:表示索引的长度。索引的长度越短,查询时的效率越高。

9.ref:用来表示哪些列或常量被用来与key列中命名的索引进行比较

10.rows:表示此操作需要扫描的行数,即扫描表中多少行才能得到结果

11.filtered:表示此操作过滤中保留的的行数占扫描行数的百分比。 值越小,说明该步骤筛选掉的数据越多。

12.Extra:表示其他额外的信息,包括Usingindex、Using filesort、Using temporary等。


我们做执行计划查看时,比较重要的几个字段分别介绍下他们的不同值都有哪些区别:

首先说type,他有以下几个取值内容,并给出了具体的SQL(PS:以下SQL是我实际测试过的,但是具体的表内
容不一样可能最终优化器优化后的效果可能也不一样。)

system:系统表,少量数据,往往不需要进行磁盘I0

const:使用常数索引,MySQL只会在查询时使用常数值进行匹配。
    explain select*from t2 where f = 'Hollis';
    使用唯一性索引做唯一查询

eq_ref:唯一索引扫描,只会扫描索引树中的一个匹配行。
    explain select*from tl join t2 on tl.id= t2.id where t1.f1 = 's';
    当在连接操作中使用了唯一索引或主键索引,并且连接条件是基于这些索引的等值条件时,MVSQL通常
    会选择 eq ref连接类型,以提高查询性能。

ref:非唯一索引扫描,只会扫描索引树中的一部分来查找匹配的行,
    explain select*fromt2where a = 'Hollis';
    使用非唯一索引进行查询

range:范围扫描,只会扫描索引树中的一个范围来查找匹配的行。
    explain select*fromt2where a > 'a'and a < 'c'
    使用索引进行性范围查询

index:全索引扫描,会遍历索引树来查找匹配的行
    explain selectcfromt2where b = 's';
    不符合最左前缀匹配的查询    

ALL:全表扫描,将遍历全表来找到匹配的行,
    explain select*from t2 where d = “ni";
    使用非索引字段查询

需要注意的是,这里的index表示的是做了索引树扫描,效率并不高。以上类型由快到慢
system > const > eq_ref > ref > range > index > ALL

接着说一个很重要!的字段,但是经常被忽略的字段extra,这个字段描述了 MVSQL在执行查询时所做的一些附
加操作。下面是 Extra 可能的取值及其含义:

Using where:表示 MySQL将在存储引擎检索行后,再进行条件过滤(使用 WHERE 子句);查询的列未
被索引覆盖,where筛选条件非索引的前导列或者where筛选条件非索引列。
    explain select*from t2 where d ="ni";  非索引字段查询
    explain select d from t2 where b = "ni"; 未索引覆盖,用联合索引的非前导列查询

Using index:表示 MySQL使用了覆盖索引(也称为索引覆盖)优化,只需要扫描索引,而无需回到数据表
中检索行;
    explain selectb,cfromt2 where a="ni"; 索引覆盖

Using index condition:表示查询在索引上执行了部分条件过滤。这通常和索引下推有关
    explain selectdfrom t2 where a=“ni"and b like"s%"; 使用到索引下推

Using where; Using index:查询的列被索引覆盖,并且where筛选条件是索引列之一,但不是索引的前导
列,或者where筛选条件是索引列前导列的一个范围
    explain select afromt2 where b= "ni"; 索引覆盖,但是不符合最左前缀
    explain select b from t2 where a in('a','d','sd'); 索引覆盖,但是前导列是个范围

Using join buffer:表示 MySQL使用了连接缓存;
    explain select*from tl join t2 on t1.id = t2.id where a ='s';

Using temporary:表示 MySQL 创建了临时表来存储査询结果。这通常是在排序或分组时发生的;
    explain select count(*)bfrom t2 group by b;

Using filesort:表示 MVSQL将使用文件排序而不是索引排序,这通常发生在无法使用索引来进行排序时,
    explain select count(*),bfromt2 group by b;

Using index for group-by:表示 MySQL 在分组操作中使用了索引。这通常是在分组操作涉及到索引中的
所有列时发生的;

Using filesort for group-by:表示 MySQL 在分组操作中使用了文件排序。这通常发生在无法使用索引进行分组操作时;

Range checked for each record:表示 MySQL 在使用索引范围査找时,需要检査每一条记录;

Using index for order by:表示 MySQL 在排序操作中使用了索引,这通常发生在排序涉及到索引中的所有
列时;

Using filesort for order by:表示 MySQL 在排序操作中使用了文件排序,这通常发生在无法使用索引进行排序时;

Using index for group-by; Using index for order by:表示 MySQL 在分组和排序操作中都使用了索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

《小书生》

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值