MySQL中explain用途和效果剖析(详解)
![](/uploads/allimg/200930/5f042c6d2d7a869815765.jpg)
1. EXPLAIN简介
使用EXPLAIN关键字可以模拟优化器施行SQL查询语句,从而知道MySQL是怎样处置你的SQL语句的。剖析你的查询语句或是表构造的机能瓶颈。
? 通过EXPLAIN,我们可以剖析出以下结果:
- 表的读取次序
- 数据读取操纵的操纵类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的援用
- 每张表有多少行被优化器查询
? 使用方式如下:
EXPLAIN +SQL语句
EXPLAIN SELECT * FROM t1
施行方案包括的信息
2. 施行方案各字段含义
2.1 id
select查询的序列号,包括一组数字,表示查询中施行select子句或操纵表的次序
id的结果共有3中状况
id雷同,施行次序由上至下
[总结] 加载表的次序如上图table列所示:t1 t3 t2id不一样,假如是子查询,id的序号会递增,id值越大优先级越高,越先被施行
- id雷同不一样,同时存在
如上图所示,在id为1时,table显示的是<derived2>
,这里指的是指向id为2的表,即t3表的衍生表。
2.2 select_type
常见和常用的值有如下几种:
离别用来表示查询的类型,主如果用于不同一般查询、结合查询、子查询等的复杂查询。
SIMPLE
简便的select查询
,查询中不包括子查询或者UNION
PRIMARY 查询中若
包括任何复杂的
子部分,最外层查询则被标志为PRIMARY
SUBQUERY
在SELECT或WHERE列表中包括了子查询
DERIVED 在FROM列表中包括的
子查询被标志为DERIVED
(衍生),MySQL会递归施行这些子查询,把结果放在暂时表
中UNION 若第二个SELECT显现在UNION之后,则被标志为UNION:若UNION包括在FROM子句的子查询中,外层SELECT将被标志为:DERIVED
UNION RESULT 从UNION表猎取结果的SELECT
2.3 table
指的就是当前施行的表
2.4 type
type所显示的是查询使用了哪品种型,type包括的类型包罗如下图所示的几种:
从最好到最差顺次是:
system > const > eq_ref > ref > range > index > all
一样来说,得包管查询至少到达range级别,最好能到达ref。
system
表只要一行记载(等于系统表),这是const类型的特列,平常不会显现,这个也可以忽略不计const
表示通过索引一次就寻到了,const用于比力primary key 或者unique索引。由于只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
第一停止子查询得到一个结果的d1暂时表,子查询前提为id = 1 是常量,所以type是const,id为1的相当于只查询一笔记录,所以type为system。eq_ref
独一性索引扫描,关于每个索引键,表中只要一笔记录与之匹配。常见于主键或独一索引扫描ref
非独一性索引扫描,返回匹配某个独自值的所有行,本质上也是一种索引拜访,它返回所有匹配某个独自值的行,然而,它大概会寻到多个相符前提的行,所以他应当属于查寻和扫描的混合体。range
只检索给定范畴的行,使用一个索引来选中行,key列显示使用了哪个索引,一样就是在你的where语句中显现between、< 、>、in等的查询,这种范畴扫描索引比全表扫描要好,由于它只需要开端于索引的某一点,而完毕于另一点,不消扫描全部索引。index
Full Index Scan,Index与All不同为index类型只遍历索引树。这平常比ALL快,由于索引文件平常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘读取的)
id是主键,所以存在主键索引all
Full Table Scan 将遍历全表以寻到匹配的行
2.5 possible_keys 和 key
possible_keys
显示大概利用在这张表中的索引,一个或多个。查询触及到的字段上若存在索引,则该索引将被列出,但不必然被查询实际使用。
key
- 实际使用的索引,假如为NULL,则没有使用索引。(大概缘由包罗没有创立索引或索引失效)
- 查询中若使用了
覆盖索引
(select 后要查询的字段恰好和创立的索引字段完全雷同),则该索引仅显现在key列表中
2.6 key_len
表示索引中使用的字节数,可通过该列运算查询中使用的索引的长度,在不亏损准确性的状况下,长度越短越好
。key_len显示的值为索引字段的最大大概长度,并非实际使用长度,即key_len是按照表定义运算而得,不是通过表内检索出的。
2.7 ref
显示索引的那一列被使用了,假如大概的话,最好是一个常数。哪些列或常量被用于查寻索引列上的值。
2.8 rows
按照表统计信息及索引选用状况,大致预算出寻到所需的记载所需要读取的行数,也就是说,用的越少越好
2.9 Extra
包括不适合在其他列中显式但十分重要的额外信息
2.9.1 Using filesort(平安无事)
说明mysql会对数据使用一个外部的索引排序,而不是依照表内的索引次序停止读取。MySQL中没法利用索引完成的排序操纵称为“文件排序”。
2.9.2 Using temporary(十死无生)
使用了用暂时表留存中心结果,MySQL在对查询结果排序时使用暂时表。常见于排序order by和分组查询group by。
2.9.3 Using index(发财了)
表示响应的select操纵中使用了覆盖索引(Covering Index),幸免拜访了表的数据行,效力不错。假如同时显现using where,表白索引被用来施行索引键值的查寻;假如没有同时显现using where,表白索援用来读取数据而非施行查寻动作。
2.9.4 Using where
表白使用了where过滤
2.9.5 Using join buffer
表白使用了连接缓存,比方说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。
2.9.6 impossible where
where子句的值总是false
,不克不及用来猎取任何元组
SELECT * FROM t_user WHERE id = '1' and id = '2'
2.9.7 select tables optimized away
在没有GROUPBY子句的状况下,基于索引优化MIN/MAX操纵或者关于MyISAM储备引擎优化COUNT(*)操纵,不必比及施行阶段再停止运算,查询施行方案生成的阶段即完成优化。
2.9.8 distinct
优化distinct操纵,在寻到第一匹配的元组后即休止寻一样值的动作
3. 实例剖析
- 施行次序1:select_type为UNION,说明第四个select是UNION里的第二个select,最先施行【select name,id from t2】
- 施行次序2:id为3,是整个查询中第三个select的一部分。因查询包括在from中,所认为DERIVED【select id,name from t1 where other_column=’’】
- 施行次序3:select列表中的子查询select_type为subquery,为整个查询中的第二个select【select id from t3】
- 施行次序4:id列为1,表示是UNION里的第一个select,select_type列的primary表示该查询为外层查询,table列被标志为
<derived3>
,表示查询结果来自一个衍生表,其中derived3中的3代表该查询衍生自第三个select查询,即id为3的select。【select d1.name …】 施行次序5:代表从UNION的暂时表中读取行的阶段,table列的< union1,4 >表示用第一个和第四个select的结果停止UNION操纵。【两个结果union操纵】
引荐学习:mysql教程
以上就是MySQL中explain用途和结果剖析(详解)的具体内容,更多请关注百分百源码网其它相关文章!