explain-SQL语句执行计划分析

explain


https://www.cnblogs.com/xiaoboluo768/p/5400990.html

http://blog.51cto.com/lijianjun/1881208

id:查询序号

 

select_type:查询类型

 

table:查询针对的表

       有可能是

       实际的表名  如select * from t1;

       表的别名  如select * from t1 as tmp;

       derived 如from型子查询时

       null 直接计算得结果,不用走表

 

possible_keys:可能用到的索引

       注意:系统估计可能用到的几个索引,但最终只能用一个

 

key:最终用的索引

key_len:使用的索引的最大长度

 

:有可能possible_keys为null,而key不为null这种情况

possible_keys分析的是索引用于查找的过程

而最终的key可能是被用于查找,排序或索引覆盖

例:http://www.zixue.it/thread-11966-1-1.html

 

type

较为重要的一个指标,从好到差依次是:system > const > eq_ref > ref > fulltext >ref_or_null > index_merge > unique_subquery > index_subquery >range > index > ALL
     一般来说,得保证查询至少达到range级别,最好能达到ref

      

1) all:全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录

      

2) index:索引全表扫描,把索引从头到尾扫一遍

       两种情况会出现

      1.索引覆盖的情况下,能利用上索引数据,但利用不上索引查找,必须全索引扫描例:explain select c3 from t3 where          c1+2=1 \G  index(c1, c2, c3)

       2.是利用索引来进行排序,但取出所有节点

        select goos_id from goods order by goods_id desc;

        分析:没有加where条件,就得取所有索引节点,同时又没有回行,只取索引节点再排序,经过所有索引节点

      

3)range索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between<>等的查询

      

4)index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重

      

5)unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值

      

6)index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引

      

7)ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多

      

8)fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引

 

9) ref 非唯一性索引扫描或者,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找

      

10) eq_ref 出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref

 

11) const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描

 

12) system:表中只有一行数据或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index

      

rows:执行计划中估算的扫描行数,不是精确值

 

ref:指连接查询时,表之间的字段引用关系

 

Extra

       index:是指用到了索引覆盖,效率非常高

       using where 是指光靠索引定位不了,还得where判断一下

       using temporary 是指用上了临时表,group by与order by不同列时,或group by,order by别的表的列

       using filesort:文件排序(文件可能在磁盘,也可能在内存)

注:如果取出的列,含有text或者更大的如mediumtext等,filesort将会发生在磁盘上

 

from型子查询

注意:内存from查到的临时表是没有索引的

所以:from的返回内容要尽量少,需要排序在内层先排好序

 

union优化

union总是要产生临时表,对union的优化比较棘手。union all不需要去重复,union去重就需要排序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值