MySQL的explain用法详解


参考原文出处:http://zhongmin2012.iteye.com/blog/2414577

explain能干嘛?
1、通过explain可以分析出表的读取顺序;
    例如:id字段
2、数据读取操作的操作类型;
    例如:select_type
3、哪些索引可以使用;
     通过分析possible_keys字段
4、哪些索引被实际使用;
     通过分析key字段
5、表之间的引用;
     通过分析ref字段
6、每张表有多少行被优化器查询;
    通过分析rows字段

先看一个例子:

mysql> explain select * from t_dictionary;

+----+-------------+--------------+------------+------+---------------+------+---------+------+------+----------+-------+

| id | select_type | table        | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |

+----+-------------+--------------+------------+------+---------------+------+---------+------+------+----------+-------+

|  1 | SIMPLE      | t_dictionary | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  154 |   100.00 | NULL  |

+----+-------------+--------------+------------+------+---------------+------+---------+------+------+----------+-------

解释一下长长的每一行的含义:

id

select标识符号。分为三种情况:

  1. id相同:按照顺序,由上至下执行;
  2. id不同:序号大的先执行,id越大优先级越高;
  3. id相同又不同:首先id序号大的先执行,然后如果id相同按照顺序由上而下执行。所有组中id越大越先被执行,
     剩下的id相同的情况下,按照顺序由上而下;
  4. 总结:通过id可以知道表的读取顺序;
select_typ

select类型一共有六个查询类型:

  1. simple:简单select(不使用UNION或子查询);
  2. primary:最外层的select,最后被加载,被标记为;
  3. subquery:子查询;
  4. union:第二个select出现在union之后,被标记为union;若union包含在from语句中,最外层被标记为device;
  5. union result:两种union结果的合并;
  6. device:衍生的意思,就是通常所说的临时表;
  7. 总结:数据读取操作的操作类型;
table所引用的表;
type

联接类型,下面按照从最佳类型到最坏类型的解释;

  1. system:表中只有一行记录(相当于mysql的系统表);
  2. cost:常量的意思;通过索引一次就找到了,只因为匹配了一行数据,表中最多查询出一条数据,所有很快;
    比如通过主键查找:explain select * from t_dictionary where id=1;
  3. eq_ref:唯一索引扫描,记录上匹配有且只有一条记录,常用于主键或者唯一索引(外建);
    比如:select * from t1,t2 where t1.id=t2.id
  4. ref:非唯一索引扫描,记录上匹配有多条记录,返回匹配的所有值;
  5. range:只检索给定范围的行,使用一个索引来选择;
    比如:一般就是出现在wehre后面的between...and、in、not...in;
  6. index:index与all相比,index只遍历索引树,比All快,因为索引文件比数据文件小;
  7. all:全表扫描,将遍历全表找,以找到匹配的行;
  8. 总结:最好的到最差的依次是:system>const>eq_ref>ref>range>index>all;
              一般来说,保证达至少到range和ref级别,最好到ref级别;
possible_keys查询的时候,可能用到那个索引找到匹配的行;
key显示实际用到的索引,如果没有用到索引显示为NULL;
key_len显示使用索引建的长度,如果没有使用索引显示为空;在相同的查询产出下;
ref显示表之间的引用和以及关联关系;
rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数; 

总结:每张表有多少行被优化器查询;rows值越小越好;

filtered显示了通过条件过滤出的行数的百分比估计值;
extra

包含不适合在其他列中显示但十分重要的额外信息;

  1. using filesort:mysql会使用一个外部的索引排序,而不是按照表内的索引顺序进行读取;”文件排序“
    mysql无法使用索引完成的排序操作;
  2. using temporay:使用了临时表保存中间结果,MySQL在对查询排序时使用临时表;
    常见于order by和分组group by
  3. using index:表示相应的select操作中使用了覆盖索引,避免了访问表的数据行,效率不错;
    如果同时出现using where,表明索引被用来执行索引建的查找;
    如果没有同时出现using where,表明索引用来读取数据没有执行查找动作;



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值