概述
MySQL 的 explain 命令,主要用于查看实际查询过程中的一些执行细节(执行计划),也是查看优化器决定如何执行查询的主要方法
explain 使用示例
explain 的使用也很简单,在 select 语句之前增加 explain 关键字再执行整个语句即可。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 )来访问存在索引的某个字段时,结果直接可以用索引上获得
|