MYSQL EXPLAIN

来源:互联网 发布:远程控制软件源代码 编辑:程序博客网 时间:2024/05/18 03:34


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

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

explain中的列

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

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

  id列

这列包含一个编号,标志语句所属的行:
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYNULLNULLNULL     NULLNULLNULLNULLNo    tables used2UNIONNULLNULLNULL     NULLNULLNULLNULLNo    tables usedNULLUNION RESULT<union1,2>      ALLNULLNULLNULLNULL  Using temporary

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


select_type
<span style="font-weight: normal;"><span style="font-size:10px;">idselect_typetable typepossible_keyskeykey_lenrefrowsExtra1PRIMARY      <derived2> ALLNULL        NULLNULL NULL40552 2DERIVED        t_id indexNULL       PRIMARY4NULL18691Using index3UNION        t_id indexNULL       PRIMARY4NULL18691Using indexNULLUNION RESULT  <union2,3> ALLNULL       NULLNULLNULL 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
原创粉丝点击