什么事SQL执行计划
SQL执行计划,就是一条SQL语句,在数据库中实际执行的时候,一步步的分别都做了什么。就是我们用EXPLAIN分析一条SQL语句时展示出来的那些信息
学习意义
了解SQL执行计划的意义就在于我们可以通过执行计划更加清晰的认识到这一条语句,分为了哪几步,有没有用到索引,是否有一些可优化的地方等。
所有字段
实际运行一个EXPLAIN时候,我们都能看到下面的这个表头
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
id
select 查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
- id相同:执行顺序由上而下
- id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
- id有相同有不同:id相同的认为是一组,从上往下执行,id不同的,值越大越先执行
select_type
查询的类型,主要用于区分普通查询、联合查询、子查询等复杂的查询
- SIMPLE:简单的select查询,查询中不包含子查询或者uninon
- PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
- SUBQUERY:在select或where列表中包含了子查询
- DERIVED:在from列表中包含的子查询被标记为derived,mysql或递归执行这些子查询,把结果放在零时表里
- UNION:若第二个select出现在union之后,则被标记为union,若union包含在from子句的子查询中,外层select将被标记为derived
- UION RESULT:从uion表获取结果的select
type
访问类型,sql查询优化中一个很重要的指标。
- system:表只有一行记录(等于系统表),这是const类型的特例
- const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。如果将主键置于where列表中,mysql就能将该查询转换为一个const
- eq_ref:唯一索引扫描,常见于主键或唯一索引
- ref:非唯一索引扫描,返回匹配某个单独值的所有行
- range:一般就是在where语句中出现了bettween、<、>、in等的查询
- index:只遍历索引树
- all:遍历全表
possible_keys
查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用
key
实际使用的索引,如果为NULL,则没有使用索引
key_len表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。
ref
显示索引的哪一列被使用了,如果可能,是一个常量const
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
Extra
不适合在其他字段中显示,但是十分重要的额外信息
- using filesort:对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取
- using temporary:使用临时表保存中间结果,也就是说mysql在对查询结果排序时使用了临时表,常见于order by和group by
- using index:表示相应的select操作中使用了覆盖索引
- using where:使用了where过滤
- using join buffer:使用了链接缓存
- impossible where:where 子句的值总是false,不能用来获取任何元组
- select tables optimized away:比如COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即可完成优化
- distinct:优化distinct操作,在找到第一个匹配的元组后即停止找同样值
综合示例
执行顺序