使用explain来分析MySQL 查询性能

为了在MySQL中写出高效的SQL脚本,我们的SQL必须时时都要用explain来检查其执行计划,时时调整。

explain 的使用方法为:

explain [sql语句]

比如下面这条SQL

explain select * 

from tbl_leihuantong t1 join tbl_tangsuan t2 on t1.id = t2.id;

在MySQL执行完以后如下所示:


id    select_type  table    type    possible_keys    key    key_len    ref            rows    Extra

1	SIMPLE	    t1	    ALL	    PRIMARY	    NULL	    NULL	    NULL	        336	Using filesort

1	SIMPLE	    t2	    eq_ref    	PRIMARY	    PRIMARY	4	    db_apple.t1.id	1	NULL

下面说一下这些列都代表什么:

select_type:查询类型

  • simple:除子查询和union外的查询

  • primary:子查询的最外部查询

  • subquery:子查询内层查询的第一个Select,不依赖于外部的查询结果集

  • uncacheable subquery:结果集无法缓存的子查询

  • dependent subquery:子查询内层查询的第一个Select,依赖外部的查询结果

  • union:union语句中第二个Select开始及后面的所有Select,Union语句中第一个Select的类型是Primary

  • union result:Union中的合并结果

  • dependent union:子查询中的Union,也是union中从第二个select开始往后的所有select,且依赖于外部查询的结果集

table:这一步所访问的数据库中的表的名称。

type:表查询时使用的查询方式,非常重要,主要看这个属性的内容来确定SQL的问题。

  • system:系统表,表中只有一行数据;

  • const:读常量,最多只会有一条记录匹配;

  • eq_ref:最多只会有一条匹配结果,一般是通过主键或唯一键来访问;

  • ref:两个表join时,被驱动表使用索引查询;

  • ref_or_null:在ref的基础上再对空值进行检查;

  • index:索引扫描;

  • index_merge:一个查询中使用了两个索引,对这两个索引的结果进行合并,再读取表数据;

  • index_subquery:子查询中返回的结果字段组合是一个索引,但不是主键或唯一索引;

  • unique_subquery:子查询中返回的结果字段组合是主键或唯一索引;

  • range:使用索引进行范围查询;

  • fulltext:全文检索;

  • all:全表扫描,最慢,数据量大时尽量避免,前台表禁止出现这种情况;

possible_keys:查询时可能使用的索引,此项极其重要,分析SQL执行计划时一定要注意到它;

  • key:这是MySQL的查询优化器从possible_keys中挑的一个索引;

  • key_len:被选中当索引的字段的长度;

  • ref:通常是const或者是用来过滤用的某个表的字段,如两个表Join时的键;

  • rows:MySQL查询优化器估算出来的结果集的大小;

Extra:具体每一步执行时的细节信息;

  • Using where:不查全表数据,或者仅通过索引还不能查询出全部所需的数据时会出现;

  • Using index:仅通过使用索引就能查询出所需的数据;如果字段过多,除了查索引,还得回到表中取数,就会出现Using where了。

  • Using temporary:使用到了临时表,通常在order by 或 group by 时会出现;

  • Using index for group-by:同Using index,如果分组字段也在索引中,就会出现Using index for group-by;

  • Select tables optimized away:查询时,在建了索引的字段时使用聚合函数如Count Min Max 等,MySQL优化器会通过索引一次定位到结果数据上面。注:如果使用group by 语句就不行了。

  • Using filesort :使用Order by时,无法通过索引完成排序,MySQL就需要选择排序算法来排,就会出现这个;

  • Distinct:查找Distinct值时,MySQL查到第一个匹配的结果后就不再找这个值;

转载于:https://my.oschina.net/gccr/blog/494299

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值