EXPLAIN 分析查询语句工具

 table:

查询的表的名称,每一行数据对应着一张表

 

id:

出现几个SELECT就会有几个唯一的id

有可能有两个SELECT但是只出现一个id的情况,这是优化器帮我们自动连接了表

id如果相同,可以认为是一组,从上往下顺序执行

在所有组中,id值越大,优先级越高,越先执行

id每个号码,表示一趟独立的查询,一个sql的查询趟越少越好

 

select_type:

查询的类型

 

partitons:

分区的情况

 

type:

System - 性能最高的

 

const - 当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const

EXPLAIN SELECT * FROM s1 WHERE id = 10005;

 

eq_ref - 在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的
如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则
对该被驱动表的访问方法就是eq_ref

EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.id = s2.id;

 

ref - 当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref

EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';

 

ref_or_null - 当对普通二级索引进行等值匹配查询,该索引列的值也可以是`NULL`值时,那么对该表的访问方法
就可能是ref_or_null

EXPLAIN SELECT * FROM s1 WHERE key1 = 'a' OR key1 IS NULL;

 

unique_subquery - 针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询
转换为EXISTS子查询,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type
列的值就是unique_subquery

EXPLAIN SELECT * FROM s1
WHERE key2 IN (SELECT id FROM s2 WHERE s1.key1 = s2.key1) OR key3 = 'a';

 

range - 如果使用索引获取某些`范围区间`的记录,那么就可能使用到range访问方法

EXPLAIN SELECT * FROM s1 WHERE key1 IN ('a', 'b', 'c');
同上
EXPLAIN SELECT * FROM s1 WHERE key1 > 'a' AND key1 < 'b';

 

index - 当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index

EXPLAIN SELECT key_part2 FROM s1 WHERE key_part3 = 'a';


all - 最熟悉的全表扫描

EXPLAIN SELECT * FROM s1;

 

 possible_keys:

可能用到的索引

 

key:

实际上使用的索引

 

key_len:

实际使用到的索引长度(即:字节数)
帮你检查`是否充分的利用上了索引,值越大越好,主要针对于联合索引,有一定的参考意义。

 

ref:

当使用索引列等值查询时,与索引列进行等值匹配的对象信息。

 

rows:

预估的需要读取的记录条数,值越小越好

 

filtered:

某个表经过搜索条件过滤后剩余记录条数的百分比

对于单表查询来说,这个filtered列的值没什么意义,我们更关注在连接查询

中驱动表对应的执行计划记录的filtered值,它决定了被驱动表要执行的次数(即:rows * filtered)

 

Extra:

一些额外的信息,更准确的理解MySQL到底将如何执行给定的查询语句

posted on 2022-01-19 21:42  每天积极向上  阅读(48)  评论(0编辑  收藏  举报

导航