跳到主要内容

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