MYSQL Explain 解析
explain说明
用于查看sql语句都执行计划,可以看到sql语句都执行了哪些索引,以及执行的顺序等等。
主要作用是优化sql语句,提高sql语句的执行效率。
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
id
select查询的序列号,表示查询执行select字句或操作表的顺序
id相同,执行顺序从上到下
id不同,值越大,先执行
select_type
表示select类型
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果)
(6) SUBQUERY(子查询中的第一个SELECT)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
table
查询的表名
type
表示msyql在表中找到所需行的方法,也叫访问类型
-
all: 全表扫描,mysql将遍历全表以找到匹配的行
-
index: 遍历索引树
-
range: 检索给定范围的行,使用索引来选择行
-
ref: 表示上述表的匹配连接条件,即哪些列/常量被用于查找索引列上的值
-
eq_ref: 类似ref,区别在使用的索引树唯一索引,对每个索引值,只有一条记录,也就是说多表连接使用
primary key
或unique key
作为关联条件 -
const, system: 当mysql对查询某部分进行优化,并转换为一个常量时使用, 如将主键置于where列表中,mysql就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
-
null: mysql在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成
possible_keys
mysql能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引被列出,但不一定被查询使用
key
mysql 查询实际使用到的索引
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,不损失精确性
extra
该列包含MySQL解决查询的详细信息,有以下几种情况:
-
Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
-
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
-
Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”
-
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
-
Impossible where:这个值强调了where语句会导致没有符合条件的行。
-
Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
总结:
• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
• EXPLAIN不考虑各种Cache
• EXPLAIN不能显示MySQL在执行查询时所作的优化工作
• 部分统计信息是估算的,并非精确值
• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。