跳到主要内容

03-执行计划

执行计划中包含的信息

ColumnMeaning
idThe SELECT identifier
select_typeThe SELECT type
tableThe table for the output row
partitionsThe matching partitions
typeThe join type
possible_keysThe possible indexes to choose
keyThe index actually chosen
key_lenThe length of the chosen key
refThe columns compared to the index
rowsEstimate of rows to be examined
filteredPercentage of rows filtered by table condition
extraAdditional information

id

select 查询的序列号,包含一组数字,表示查询中执行 select 子句或者操作表的顺序

包含三种情况

  1. id 相同: 执行顺序从上到下
  2. id 不同: 是子查询,则 id 序号递增,值越大优先级越高
  3. 同时存在 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 合并结果表

  1. 如果是具体的表名或别名,则表示从实际的物理表中获取数据
  2. 表名是 dericedN 的形式,表示使用了 id 为 N 的查询产生的衍生表
  3. 当有 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: 全索引扫描,主要有两种情况
    1. 当前查询覆盖索引
    2. 使用索引进行排序,避免了重排序
  • 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