Mysql的Explain解读

执行Explain命令后的结果如下图

explain执行语句
explain结果图

解析

select_type

包括范围:simple. primary,subquery, derived, union, union result 查询类型主要是用于区别普通查询,联合查询,子查询等复杂的查询

  • simple,简单的select 语句,查询中不包含自查询或者 union
  • primary, 查询若包含任何复杂的子部分,最外层查询则被标记为primary
  • subquery, 在 select 或 where 列表中包含子查询
  • derived,在 from 列表中包含自查询被标记为 derived (衍生)MySQL 会递归执行这些自查询,把结果放在临时表中。
  • union,若第二个 select 出现在 union 之后,则被标记为 union. 若 union 包含在 from 子句子查询中,外层 select 将别标记为 derived
  • union result, 从 union 表中获取结果的 select

table 表示哪一张表

partitions

type

链接使用的类型,优到差的依次为:system >const > eq_reg > ref > range > index > all

  1. system 表,其是 const 链接类型的特殊情况
  2. const 表中的一个记录的最大值能够匹配此查询,因为只有一行,这个值实际就是常数
  3. eq_ref 从前面的表中,对每个记录的联系都从表中读取一个记录,在查询时使用了索引为主键或唯一键的全部时使用
  4. ref 在查询时使用了不是唯一或主键的键或者是这些类型的部分时出现。对于之前的表的每个行联合,全部记录都将从表中读出。其严重依赖于根据索引匹配的记录,越少越好。
  5. range 使用索引返回一个范围中的行,用>或者<来查询时出现
  6. index 对前面的表中每个记录联系进行安全扫描,只比all好很多,索引比表的数据要少
  7. all 对每个记录联合进行安全扫描,最差情况

possible_keys

可能用在这个表中的索引,如果没空,则没有用到索引,应该根据where语句中选择一个

key

实际使用的索引,为空则表示没有使用索引。优化器很少情况下找不到任何索引的。可以在 select 中使用 use index(索引名) 或者 在 from 后面用 force index(索引名...) 来强制使用索引,或者 ignore index(索引名) 忽略索引名

key_len

使用的索引长度,长度越小越好

ref

显示索引的哪一列被使用了,如果可能的话,是一个常数

rows

需要扫描多少行才能得到结果数据

filtered

extra

  1. Distinct 找到与行相联合匹配的行,就不在搜索
  2. Not exists 优化 LEFT JOIN,一旦找到匹配的 LEFT JOIN 标准行,就不搜索
  3. Range checked for each Record 没有理想的索引,对从前面表中的每行组合,再次检查可用索引,并它返回行 - 最慢的表链接
  4. Using filesort 需要额外的步骤来进行数据排序 - 要优化
  5. Using index 列数据是仅使用了索引中的信息,没有到表中读取。在表的请求列是同一个索引的部分时可出现
  6. Using temporary 创建临时表来存储结果,在对不同列集进行 order by 时,最容易出现,而不是 group by
  7. Where used 使用了where语句来限制哪些行将与下一张表匹配或者返回给用户。在不相返回表中全部行且链接类型为all或index时出现