explain关键字的使用

204 阅读3分钟

explain关键字的主要作用是可以帮助我们查看SQL的执行计划,了解SQL的执行过程,便于我们创建合适的索引,优化sql语句的查询速度。

explain使用的方法非常简单,只要在查询语句前面加上explain关键字就行,下面是一个简单的执行语句和结果截图

explain  select * from film where film_id = 1;

从执行结果可以看到mysql反馈给我们诸多字段,这些字段有的重要,有的不重要,下面详细介绍一些比较重要的字端段

ID

ID列可以帮助我们了解sql的执行顺序,如果值相同则从上往下执行,如果值不同则数值大的先执行。我个人感觉ID最大的作用是可以在较复杂的SQL语句中帮助我们理清谁是驱动表,谁是被驱动表,从而做到小表驱动大表的优化

select_type

select_type 表示对应行是简单的还是复杂的查询,SIMPLE表示简单查询,复杂查询可以是PRIMARY,SUBQUERY,DERIVED

SIMPLE

下面是一个SIMPLE简单查询的例子

PRIMARY,SUBQUERY,DERIVED

primary:表示复杂查询中最外面的select,subquery表示包含在select中的子查询.不在from 语句中

,derived表示包含在from字句中的子查询。

下面是一个复杂查询运行结果截图

table

具体用到的哪个表,比如文章开头的那个截图用的就是film表

type

是表示查询结果性能较为重要的字段,表示性能由好到差的关键字排序是null>system>const>eq_ref>ref>range>index>ALL,下面介绍这些关键字出现的场景

null

没有访问表或者索引,没啥实际意义.下面是一个null值的例子

system

当表中只有一条数据,且存储引擎是MyISAM时,无论该列有没有创建索引.都会得到一个system,用处不大

const

在索引树上只查询了一次就查到了结果,一般出现在单表查询中,且索引一般是主键索引或者唯一索引,下面是一个取值为const的例子,其中file_id字段有主键索引

eq_ref

一般出现在两表的连接的情况下,从驱动表中取出一条数据,比如a表的主键id x ,去和b表中的aid列的每一条数据(x,y,z)比对,只比对了一次,就得到了结果(在没有建立索引的情况下要对比三次)

ref

出现在普通索引中,不论查询结果是0条,1条或多条,c表中name列有普通索引,explain使用该索引的语句运行结果如下

range

范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行

index

遍历了全索引树,下图是遍历了b表主键索引ID列的结果截图

ALL

完整的读取了整张表的数据,性能最差.

possiable_keys和key

possiable_keys表示可能用到的索引,key实际中用到的索引

ref

表查找值所用到的列或常量,常见到有const(常量),字段名(a.id)

rows

MySQL预估要读取并检测的行数

Extra

不合适在其他列展示,但是又非常重要 的信息,取值一般是,Using filesort,Using temporary,

Using index

Using filesort

Using filesort 出现该值表示没有通过索引值进行排序.进行了文件排序

Using temporary

表示产生了临时表

给name字段创建索引

alter table  d  add index idx_name(name) 

Using index

表示使用了索引,

Using index,Using where同时出现

如果和Using index 和 Using where一块出现则表示where后面的条件使用了索引,是比较理想的结果