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')) |