MySQL explain学习(MySQL版本5.7.25)
- id
- select_type
- table
- partitions
- type(重要)
- possible_keys
- key
- key_len
- ref
- rows
- filtered
- Extra
explain 包含以下几个字段
id
表示SQL执行的顺序,id相同从上往下执行,id不同时,值越大优先级别越高,有一种特殊情况,id可能为null,就是当使用union的时候,会有一张去重后的临时表
select_type
-
SIMPLE:简单的select(不使用union或者子查询)
-
PRIMARY:最外层的select
-
UNION:查询使用了union或者union all,使用union时会多一个UNION RESULT
-
UNION RESULT:查询使用union,产生的一张临时表,并且它的id为Null
-
DEPENDENT UNION:在union或union all 形成的集合查询中
-
SUBQUERY:子查询中的第一个SELECT
-
DEPENDENT SUBQUERY:子查询中的第一个select,取决于外面的查询
子查询B的查询依赖于外层A的查询
我的理解是,A表查询出来的结果会逐条执行子查询B
-
DERIVED:派生表,
table
输出结果集的表是关于哪一张表,有时候不是真实的表名
- derived(x):x是数字,代表执行的id
- union<x,y>:在使用union时,生成的临时表名,x,y分别对应的执行id
partitions
匹配的分区,目前没有学习到
type(重要)
- system:表只有一行,是const的特殊情况
- const:最多只有一行,const用于primary key(主键)或者unique(唯一键)的比较
- eq_ref:特点是使用=,而且索引的所有部分都参与join且索引是主键或非空唯一键的索引
- ref:查找条件列使用了索引而且不为主键和唯一索引
- range:基于索引的。同时除了显而易见的between,and以及’>’,’<'外,in和or也是索引范围扫描
- index:index类型和ALL类型一样,ALL全表扫描,index是扫描索引树
- ALL:全表扫描
possible_keys
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若在索引,则该索引将被列出,但不一定被查询使用
key
表明的是这次查找中所用到的索引
key_len
表示索引字段的最大可能值,并非时间使用长度,可以通过该列计算查询中使用的索引长度
长度越短越好
ref
显示索引的哪一列被使用了
rows
显示MySQL执行查询时必须检查的行数
filtered
表示返回结果的行数占需要读取行数的百分比
值越大越好
Extra
- Using where:SQL使用了where条件过滤数据(使用了where条件的SQL,需要配合explain结果中的type来综合判断)
- Using index:SQL所需要返回的所有列数据均在一棵索引树上,而无需访问实际的行记录(这类SQL语句往往性能较好)
- Using index condition:确实命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录
- Using filesort:得到所需结果集,需要对所有记录进行文件排序
(这类SQL语句性能极差,在一个没有建立索引的列上进行了order by,就会触发filesort,常见的优化方案是,在order by的列上添加索引,避免每次查询都全量排序) - Using temporary:需要建立临时表(temporary table)来暂存中间结果
(这类SQL性能较低,典型的,group by和order by同时存在,且作用于不同的字段时,就会建立临时表,以便计算出最终的结果集) - Using join buffer (Block Nested Loop):需要进行嵌套循环计算
- 待补充
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)