Explain之id(重点)
select查询的一组序列号,表示查询中执行select子句或者操作表的顺序。
- id相同,执行顺序由上至下。
- id不同,id越大优先级越高,越先被执行。
- id相同不同,同时存在。id越大优先级越高,约先执行;id相同,顺序执行。
Explain之select_type
- SIMPLE
简单查询,查询中不包含自查询或者UNION - PRIMARY
查询中包含子查询,最外层查询标记为PRIMARY - SUBQUERY
子查询 - DERIVED
from列表中出现子查询被标记为DERIVED,mysql会将查询结果放在临时表中。 - UNION
如果第二个select出现在UNION之后,则被标记为UNION
如果UNION包含在from子句的子查询中,则外层SELECT被标记为:DERIVED - UNION RESULT
从UNION表获取结果的SELECT
Explain之table
显示这一行数据是关于哪张表的。
Explain之type(重点)
显示查询用了何种类型。
从最好到最差依次是:
system>const>eq_ref>ref>range>index>all
一般来说,最少达到range级别。
- system
表中只有一行记录 - const
表示通过索引一次就找到了,用于主键索引/唯一索引。因为只匹配一行记录,所以很快。比如将主键置于where条件。 - eq_ref
唯一性索引扫描,对于每个索引键,表中只有一条记录匹配。常见主键索引/唯一索引。 - ref
非唯一性索引扫描,返回匹配单个值的所有行。 - range
只检索给定范围的行,使用一个索引来选择行。
一般就是你的where语句中出现了between/in等查询。
这种范围扫描索引比全表扫描好,因为只需要开始与索引的某一行,结束与某一行,不用扫描全部索引。 - index
index和all的区别在于,index只遍历索引树,通常比all快,因为索引文件比数据文件小。
(虽然index和all都是全表读,但是index是从索引中读取,all是从硬盘读取) - all
遍历全表找到匹配行。
Explain之possible_keys
显示可能应用在这个表的索引,一个或多个。
查询涉及到的字段上若存在索引,将会被列出。但是实际上未必使用。
Explain之key(重点)
实际使用到的索引。如果是NULL,则没有使用索引。
若查询用使用到了覆盖索引,则该索引仅出现在key列表中。
Explain之key_len
表示索引中使用的字节数,可通过该列计算出查询中使用索引的长度。
Explain之ref
显示索引中哪一列被使用了,如果可能的话,是一个常数。
Explain之rows(重点)
大致估算出查出所需记录需要读取的行数。
Explain之Extra(重点)
- using filesort
说明mysql会对数据使用一个外部的索引排序,而不是按着表内索引顺序。mysql无法利用索引完成的排序成为“文件排序”
- using temporary
使用临时表保存中间结果,mysql在对查询结果排序的时候使用临时表。常见于order by /group by。
- using index
表示使用到了覆盖索引。
如果同时出现using where,表示索引被用来执行索引键值的查找。
如果没有出现using where,表示索引被用来读取数据。
来源:https://www.bilibili.com/video/BV1mt411g7r4?p=200