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后面的条件使用了索引,是比较理想的结果