概述
MySQL
的 explain
命令,主要用于查看实际查询过程中的一些执行细节(执行计划),也是查看优化器决定如何执行查询的主要方法
explain 使用示例
explain
的使用也很简单,在 select
语句之前增加 explain
关键字再执行整个语句即可。explain
的使用示例如下所示:
-- 在 select 语句前增加 explain 关键字即可
explain select id, name, age, register_date from user where name = '小美' and age = 22 and register_date = '2015-03-05'
最终返回的数据如下所示:
注意,如果在查询语句的 from
子句中不包含子查询的情况下,使用 explain
命令并不会真正地执行查询;但是如果包含了,那么 explain
仍然会执行子查询,并将子查询的查询结果放在临时表中。
explain 返回字段介绍
使用 explain
命令之后,将会返回优化器给这条查询语句制定的执行计划相关信息,这些信息里面主要包含以下的一些字段:
id
:查询子句的执行顺序,值越大越先执行,相等的情况下,排在前面的先执行select_type
:查询类型,一共有三个取值PRIMARY
:代表的是复杂查询中最外层的select
语句DERIVED
:代表的是from
后面的子查询叫衍生表(或者派生表)SUBQUERY
:代表的是select
中的子查询
table
:表示数据从哪张表(或者哪个查询子句)查询出来partitions
:表示数据从哪个分区表中查询出来的(小知识:一张表底层是由一个或多个分区表组成的,不同的数据可能会放到不同的分区表上)type
:表示关联类型或访问类型,即MySQL
决定如何查找表中的行,以及查找数据行记录的大概范围。性能从最优到最差分别为:null
:为空时,表示 MySQL 能在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:从表中查询最小的主键值system
:当查询的表中只有一条数据时const
:用于主键或唯一索引键的列与常数进行比较时eq_ref
:使用了主键或唯一索引的全部部分,被连接使用时,最多只会返回一条符合条件的记录。range
:通常出现在范围查找中,使用索引来检索给定范围的行index
:从二级索引的第一个叶子节点开始扫描,一直到最后一个叶子节点ALL
:从主键索引的第一个叶子节点开始扫描,一直到最后一个叶子节点- 一般来说,查询最好能达到
ref
级别,最低要达到range
级别
posiible_keys
:查询过程中可能会被使用到的索引key
:实际使用的索引。有可能posiible_keys
不为空,但是key
为空,因为MySQL
最终会根据实际情况来判断是否使用索引,如果使用索引的代价比不使用索引的代价还大,那么MySQL
将不会使用索引key_len
:显示了MySQL
使用的索引字段长度,由这个值可以确定使用索引的部分ref
:查询字段的比较值,const
(常量)或者具体的列的名称rows
:MySQL
预估的要扫描的行数extra
:一些额外信息Using index
:在符合使用覆盖索引的场景情况下Using where
:使用了where
语句,且要比较的列上没有索引Using index condition
:查询的列没有完全被索引覆盖Using temporary
:查询过程中使用了临时表Using filesort
:使用外部排序,而非索引排序。如果数据较小时将在内存排序,否则需要在磁盘完成排序Select tables optimized away
:使用某些聚合函数(比如:max
、min
)来访问存在索引的某个字段时,结果直接可以用索引上获得