执行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
- system 表,其是 const 链接类型的特殊情况
- const 表中的一个记录的最大值能够匹配此查询,因为只有一行,这个值实际就是常数
- eq_ref 从前面的表中,对每个记录的联系都从表中读取一个记录,在查询时使用了索引为主键或唯一键的全部时使用
- ref 在查询时使用了不是唯一或主键的键或者是这些类型的部分时出现。对于之前的表的每个行联合,全部记录都将从表中读出。其严重依赖于根据索引匹配的记录,越少越好。
- range 使用索引返回一个范围中的行,用>或者<来查询时出现
- index 对前面的表中每个记录联系进行安全扫描,只比all好很多,索引比表的数据要少
- all 对每个记录联合进行安全扫描,最差情况
possible_keys
可能用在这个表中的索引,如果没空,则没有用到索引,应该根据where语句中选择一个
key
实际使用的索引,为空则表示没有使用索引。优化器很少情况下找不到任何索引的。可以在 select 中使用 use index(索引名) 或者 在 from 后面用 force index(索引名...) 来强制使用索引,或者 ignore index(索引名) 忽略索引名
key_len
使用的索引长度,长度越小越好
ref
显示索引的哪一列被使用了,如果可能的话,是一个常数
rows
需要扫描多少行才能得到结果数据
filtered
extra
- Distinct 找到与行相联合匹配的行,就不在搜索
- Not exists 优化 LEFT JOIN,一旦找到匹配的 LEFT JOIN 标准行,就不搜索
- Range checked for each Record 没有理想的索引,对从前面表中的每行组合,再次检查可用索引,并它返回行 - 最慢的表链接
- Using filesort 需要额外的步骤来进行数据排序 - 要优化
- Using index 列数据是仅使用了索引中的信息,没有到表中读取。在表的请求列是同一个索引的部分时可出现
- Using temporary 创建临时表来存储结果,在对不同列集进行 order by 时,最容易出现,而不是 group by
- Where used 使用了where语句来限制哪些行将与下一张表匹配或者返回给用户。在不相返回表中全部行且链接类型为all或index时出现