MYSQL EXPLAIN


 要使用explain,只需要在sql语句最前面加上explain就行,MYSQL会使语句返回执行计划中每一步,而不是执行它。它会返回一行或者多行信息,显示出执行计划中的每一部分的执行的次序。 

MYSQL5.6以下的版本的explain只支持解析select语句,5.6及以上的支持了对非select语句的解析

explain中的列

要使用explain,只需要在sql语句最前面加上explain就行,MYSQL会使语句返回执行计划中每一步,而不是执行它。它会返回一行或者多行信息,显示出执行计划中的每一部分的执行的次序。

 以下是以select语句为作为学习的例子

  id列

这列包含一个编号,标志语句所属的行:
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	NULL	NULL	NULL	     NULL	NULL	NULL	NULL	No    tables used
2	UNION	NULL	NULL	NULL	     NULL	NULL	NULL	NULL	No    tables used
NULL	UNION RESULT	<union1,2>	      ALL	NULL	NULL	NULL	NULL  Using temporary

注意id为NULL这一列,UNION结果总是放在一个匿名的临时表中, 之后MYSQL将结果读取到临时表外。临时表并不在原SQL语句中出现,因此他的id列是NULL


select_type
<span style="font-weight: normal;"><span style="font-size:10px;">id	select_type	table	 type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	      <derived2> ALL	NULL	        NULL	NULL	 NULL	40552	 
2	DERIVED	        t_id	 index	NULL	       PRIMARY	4	NULL	18691	Using index
3	UNION	        t_id	 index	NULL	       PRIMARY	4	NULL	18691	Using index
NULL	UNION RESULT  <union2,3> ALL	NULL	       NULL	NULL	NULL	 NULL	</span></span> 


这一列显示了对应行是简单还是复杂查询。MYSQL将select分为简单和复杂类型,复杂类型又分为三大类:简单子查询,派生表(在from字句中的子查询),UNION查询。 simple意味着查询不包括子查询和UNION。 PRIMARY 如果有复杂查询,最外层为PRIMARY
SUBQUERY 包含在SELECT列表中的子查询中的SELECT,也就是不在FROM子句中 DERIVED 表示包含在FROM子句的子查询中的SELECT,MYSQL会递归执行并将结果放到一个临时表。服务器内称其‘派生表’,因为该表是从子查询中派生来的。 UNION RESULT 用来从UNION的匿名临时表检索结果的SELECT被标记为UNION RESULT

table 列

这一列显示了对应正在访问那个表(或者是表的别名),

type列

这一列表明的是访问类型,sql有没有用到索引也就是看这一列,下面是最重要的访问类型,依次从最差到最优

ALL

这表示需要全表扫描(例外,如果在查询里用了LIMIT或者extra中显示了'Using distinct/not exists')

index

这个跟全表扫描是一样的,只不过是MYSQL扫描表是按照索引次序进行而不是行,他主要的优点是避免了排序,最大的缺点是要承担按索引顺序读取整个表的开销。如果在extra列看到了‘using index’表示MYSQL正在使用覆盖索引,它知识扫描索引的数据,而不是按照索引的次序的每一行。它比按照索引次序全表扫描要小的多。

range

范围扫描就是一个有限制的索引扫描

ref

这是一种索引访问(也可叫做索引查找),它返回所有匹配某个单个值的行 ,它可能会找到多个符合条件的行,算是查找和扫描的混合体

eq_ref

使用这种索引查找,MYSQL知道最多只返回一条记录。

const,system

当MYSQL能对查询的某部分进行优化并将其转换成一个常量时,会使用这些访问类型

null

这中访问方式意味着MYSQL能在优化阶段分解查询语句,在执行阶段不需要去访问表或者索引

possible_keys列

这一列显示了查询可以使用那些索引

key列

这一列显示了MYSQL决定采用那个索引来优化对该表的访问

key_len列

该列显示了MYSQL在索引里使用的字节数

ref列

这一列显示了之前的表在key列记录的索引中查找值所用的列或常量

rows列

这一列是MYSQL估计所要找的行而要读取的行数

filtered列

在使用EXPLAIN EXTENED时出现。他显示的是针对表里符合某个条件(where或者连接条件)的记录书店百分比所做的一个悲观的估计

extra列

这一列包含的是不适合在其他列显示的额外信息 最重要的值如下: Using index,表示查询用到了覆盖索引(注意这里的index不同与type里的index) Using where 表示MYSQL服务器将在存储引擎检索后再进行过滤 Using  temporary 表示MYSQL在对查询结果排序时会使用一个临时表 Using filesort 表MYSQL会对结果使用一个外部索引排序,而不是按照索引次序从表里读数据 Range checked for each record,表示没有好用的索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值