目录
下面介绍Explain中的列的具体含义
1.id列
id列的编号是select的序列号,有几个select语句就有几个id。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行
2.select_type列
select_type表示对应查询语句是简单查询还是复杂查询。
1)simple:是简单查询。表示该select语句不包含子查询和union语句
2)primary:表示复杂查询中 最外层的select语句
3)subquery:包含在select中 的子查询(不在from子句中)
4)derived:包含在from子句中 的子查询。Mysql会将from子句中的结果存放在一个临时表中,该表也称为派生表。(derive的英文含义)
5)union:在union查询语句中的第二个和随后的select子句
举例:
3.table列
这一列表示 explain的这一行正在访问哪个表。
1)当 from 子句中有子查询时,如果table列是 <derivenN> 格式,则表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。
2)当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id。
4.partitions列
如果该查询是基于分区表的查询,partitions字段会显示查询所访问的分区。
5.type列(关键)
这一列表示关联类型或访问类型,即,Mysql决定通过哪种方式查找数据表中的数据。
从优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,至少需要保证查询达到range级别,最好达到ref级别。
1)NULL:Mysql能够在优化阶段分解查询语句,执行阶段用不着再访问表或索引(速度极快)。例如,在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表。
2)const:Mysql能对查询的某部分进行优化,并将其转化成一个常量。用于primary key或unique key的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。
3)system:是const的特例,表里只有一条元组匹配时是system。
4)eq_ref:primary key或unique key索引(主键索引或唯一索引)的所有 被连接 使用,最多只会返回一条符合条件的记录。简单的select不会出现这种type。
5)ref:相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一索引的部分前缀,索引要和某个值比较,可能会找到多个符合条件的行。
i. 简单select索引,name是普通索引(非唯一索引)
ii. 关联表查询(idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了idx_film_actor_id索引中的左边前缀film_id部分)
6)range:范围扫描通常出现在in(),between,>,<,>=等操作中,使用索引来检索给定范围的行。
7)index:扫描全索引就能拿到结果,和ALL有区别。(从第一条扫到最后一条)
这种扫描一般是扫描某个二级索引,这种扫描不会从索引树根节点开始查找,而是直接对二级索引的叶子结点遍历和扫描,速度还是比较慢的,这种查询一般使用的是覆盖索引(二级索引,它比较小,通常比ALL快一些)。
8)ALL:全表扫描,扫描聚簇索引的所有叶子结点。
6.possible_keys列
这一列显示查询时可能使用哪些索引来查找。(观察该列,可能找到一些优化的方向)
使用explain时,可能出现这种情况,possible_keys有显示列,而key显示NULL的情况,这种情况是因为表中数据不多,Mysql优化器认为查询时走索引对此查询语句帮助不大,从而优化器会选择全表扫描(扫描聚簇索引),而不是走索引来查询。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查where子句看是否可以构造一个合适的索引来提高查询性能,然后用explain查看效果。
7.key列
这一列显示Mysql实际上采用哪个索引字段来优化对该表的访问。实际查询时使用的key。
8.key_len列
通过该列能计算出MySQL在执行查询时使用了哪几个索引字段。
这一列显示Mysql在索引中使用的字节数,通过这个值能够计算出具体使用了索引中的哪些列。
9.ref列(了解)
这一列显示了在key列记录的索引中,表查找所用到的列或常量,常见的有:const(常量)、字段名(file.id)
10.rows列(了解)
这一列是Mysql估计出的 要读取并检测的行数,注意,这个并不是结果集中的行数。(MySQL预测将要读取的行数,不是真实结果的数量)
11.filtered列(了解)
该列是一个百分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。
12.Extra列(关键)
这一列展示额外的信息,常见值如下:
1)Using index:使用覆盖索引,效率较好(覆盖索引一般指的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要回表)
2)Using where:使用where语句来处理结果,并且查询的列未被索引覆盖
3)Using index condition:查询的列不完全被索引覆盖(可能回表,存在优化可能),where条件中可能是个范围
4)Using temporary:Mysql需要创建一张临时表来处理查询,出现这种情况一般是需要进行优化的,首先要想到使用索引来优化。
5)Using filesort:将用外部排序而不是索引排序,数据较小时在内存排序,否则需要在磁盘完成排序。这种情况也需要考虑使用索引来优化。(索引自带排序特性)
6)Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段。