为了在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查到第一个匹配的结果后就不再找这个值;
来源:oschina
链接:https://my.oschina.net/u/114016/blog/494299