03-执行计划
执行计划中包含的信息
Column | Meaning |
---|---|
id | The SELECT identifier |
select_type | The SELECT type |
table | The table for the output row |
partitions | The matching partitions |
type | The join type |
possible_keys | The possible indexes to choose |
key | The index actually chosen |
key_len | The length of the chosen key |
ref | The columns compared to the index |
rows | Estimate of rows to be examined |
filtered | Percentage of rows filtered by table condition |
extra | Additional information |
id
select 查询的序列号,包含一组数字,表示查询中执行 select 子句或者操作表的顺序
包含三种情况
- id 相同: 执行顺序从上到下
- id 不同: 是子查询,则 id 序号递增,值越大优先级越高
- 同时存在 id 相同与不同: 相同的为一组,从上往下顺序执行,所有组中 id 值越大优先级越高
select_type
- sample: 简单查询,不包括子查询和 UNION
- primary: 包括任何复杂的子查询的最外层查询
- union: 若第二个 select 出现在 union 之后,则被标记为 union
- dependent union: 跟 union 类似,dependent 表示 union 或 union all 联合而成的结果会受外部表影响
- union result: 从 union 表获取结果的 select
- subquery: 在 select 或者 where 中包含了子查询
- dependent subquery: subquery 的子查询要受到外部表查询的影响
- DERIVER: from 子句中出现的子查询,也叫派生类
- UNCACHEABLE SUBQUERY: 表示使用的子查询的结果不能被缓存
- uncacheable union: 表示 union 的查询结果不能被缓存
table
对应的行正在访问哪一个表(表名或别名),可能是临时表或者 union 合并结果表
- 如果是具体的表名或别名,则表示从实际的物理表中获取数据
- 表名是 dericedN 的形式,表示使用了 id 为 N 的查询产生的衍生表
- 当有 union result 的时候,表名是 union n1,n2 的形式,n1、n2 表示参与 union 的id
type
访问类型,表示以何种方式访问数据,效率从最好到最坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般情况下至少需要保证查询达到 range 级别,最好能达到 ref
- all: 全表扫描,出现且数据量较大时需要进行优化
- index: 全索引扫描,主要有两种情况
- 当前查询覆盖索引
- 使用索引进行排序,避免了重排序
- range: 利用索引查询时限制了范围,在指定范围内进行查询,避免了 index 的全索引扫描
- index_subquery: 利用索引关联子查询,不再扫描全表
- unique_subquery: 类似于 index_subquery,使用的是唯一索引
- index_merge: 在查询过程中需要多个索引组合使用
- ref_or_null: 对于某个字段即需要关联条件,又需要 null 值的情况下,查询优化器会选择这种访问方式
- ref: 使用了非唯一性索引进行查询
- eq_ref: 使用了唯一性索引进行查询
- const: 表中最多有一个匹配行
- system: 表只有一行记录(等于系统表),基本不会出现
possible_keys
显示可能应用在这张表中的索引,一个或多个,查询涉及到的字段上如果存在索引,则该索引会被列出,但是不一定会被实际使用
key
查询实际使用的缩影,如果是 null 则表示没有使用索引,如果查询中使用了覆盖索引,则该索引和查询的 select 字段重叠
key_len
表示索引中使用的字节数,可以通过 key_len 计算查询中使用的索引长度,在不损失精度的情况下越短越好
ref
表示索引的哪一列被使用了,如果可能的话,是一个常数
rows
根据表的统计信息及索引使用情况,大致估算出找出所需记录需要读取的行数
重要参数,直接反映了 sql 查找了多少数据,在完成目的的情况下越少越好
extra
额外信息
- using filesort: 表示无法利用索引排序,只能利用排序算法进行排序,会消耗额外空间
- using temporary: 建立临时表保存中间结果,查询完成后删除
- using index: 当前查询覆盖索引,直接从索引中获取数据,不用回表。同时出现 using where 表示索引被用于执行索引键值的查找,没有出现则表示索引用于读取数据
- using index condition: 5.6 后加入的新特性,会先条件过滤索引,过滤完索引后找到所有符合条件的数据行,随后用 where 子句中的其他条件过滤数据行
- using where: 使用 where 进行条件过滤
- using join buffer: 使用连接缓存
- impossible where: where 语句的结果总是 false