Mysql explain

mysql> explain select * from users where userid=1;

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE users NULL const PRIMARY PRIMARY 8 const 1 100.00 NULL
标识 含义
id 标识符
select_type 查询的类型
table 输出结果集的表
partitions 匹配的分区
type 连接类型
possible_keys 可能使用的索引
key 实际使用的索引
key_len 索引字段的长度
ref 列与索引的比较
rows 扫描出的行数
filtered 按表条件过滤的行百分比
Extra 执行情况的描述和说明

1.id

如果是子查询,id的序号会递增,SQL执行的顺序的标识,SQL从大到小的执行

mysql> explain select userid from users where userid=1 union select usrgrpid userid from usrgrp where usrgrpid=7;

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY users NULL const PRIMARY PRIMARY 8 const 1 100.00 Using index
2 UNION usrgrp NULL const PRIMARY PRIMARY 8 const 1 100.00 Using index
NULL UNION RESULT <union1,2> NULL ALL NULL NULL NULL NULL NULL NULL Using temporary

当该行数据引用了其它查询的UNION结果时,id列显示为NULL,此时,table列显示类似这样:< unionM,N>,表示引用了查询标识为M、N的两行的UNION结果。如:

2.select_type 查询类型

查询类型 含义

(1)SIMPLE—— 简单查询(不包含子查询或UNION)
(2)PRIMARY ——子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY
(3)UNION—— UNION语句中第二或更后面的查询
(4)DEPENDENT UNION—— UNION中的第二个或后面的SELECT语句,取决于外面的查询
(5)UNION RESULT ——UNION的结果,union语句中第二个select开始后面所有select
(6)SUBQUERY—— 子查询中的第一个SELECT,结果不依赖于外部查询
(7)DEPENDENT SUBQUERY—— 子查询中的第一个SELECT,依赖于外部查询
(8)DERIVED ——派生表的SELECT, FROM子句的子查询
(9)MATERIALIZED ——物化子查询
(10)UNCACHEABLE SUBQUERY ——一个子查询的结果不能被缓存,必须重新评估外链接的第一行
(11)UNCACHEABLE UNION—— 属于无法缓存的子查询的UNION的第二或更后面的查询

3.table

显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如上面的e,d,也可能是第几步执行的结果的简称

4.type

对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)

type 含义
ALL Full Table ScanMySQL将遍历全表以找到匹配的行
index Full Index Scan,index与ALL区别为index类型只遍历索引树
range 只检索给定范围的行,使用一个索引来选择行
ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
eq_ref 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
const/system 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
NULL MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

5.possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)

6.Key

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中

7.key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

8.ref

列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

9.rows

估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

10.Extra

https://blog.csdn.net/qq_39781497/article/details/103599426
该列包含MySQL解决查询的详细信息,有以下几种情况:

类型 意义
Using where SQL使用了where条件过滤数据(explain select * from user where sex='no';)
using index SQL所需要返回的所有列数据均在一棵索引树上,而无需访问实际的行记录(explain select id,name from user where name='shenjian';)
using index condition 确实命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录 (explain select id,name,sex from userwhere name='shenjian';该SQL语句与上一个SQL语句不同的地方在于,被查询的列,多了一个sex字段。)
Using filesort 得到所需结果集,需要对所有记录进行文件排序(explain select * from user order by sex;)
Using temporary 需要建立临时表(temporary table)来暂存中间结果(select * from user group by name order by sex;)
Using join buffer (Block Nested Loop) 需要进行嵌套循环计算(explain select * from user where id in (select id from user where sex='no'))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容