explain 详解
explain工具用来查看SQL执行计划,多用来优化索引,关键要了解它返回字段的含义。其中最主要的信息在type和extra列。
1 select_type 列
这一列显示对应行是简单还是复杂select。
- SIMPLE:意味着查询不包括子查询和union。
- PRIMARY:有任何复杂的子部分,最外层部分标记为
- SUQUERY:包含在select列表中的子查询中的select,或者说不在from字句中
- DERIVED:表示包含在from子句的子查询中的select,mysql会递归执行并将结果放到一个临时表。“派生表”。
- UNION: 在union中的第二个和随后的select被标记为union。
- UNION RESULT: 用来表示从union的匿名临时表检索结果的select被标记为union result。
2 type列
访问类型,mysql决定如何查找表中的行,下面是最重要的方法,从最差到最优。
- ALL: 全表扫描
- index: 和全表扫描一样,只是扫描时按索引次序进行而不是行。优点是避免了排序。缺点是承担按索引次序读取整个表的开销。如果extra列看到using index,说明mysql使用了覆盖索引,只扫描索引的数据,而不是按索引次序的每一行,开销要少。
- range: 范围扫描就是有限制的索引扫描,显而易见的范围扫描是带有between、where中的>查询。in、or 也显示为range,但是性能有差异。
- ref: 索引访问,返回的单个值的行。
- eq_ref: 用这个索引,mysql 知道最多只返回一条符合条件的记录。主键和唯一性索引
- const, system: 当能对查询的部分进行优化并将其转为一个常量时。
- null: 意味着在优化阶段用不着访问表或者索引,如索引列取最小值可以直接通过单独查索引完成,不需要执行时访问表。
3 Extra
这一列包含的是额外信息
- Using index: 此值表示覆盖索引,避免回表,和type的index不同。
- Using index condition:索引下推。
- Using where: 服务器在存储引擎检索后再进行过滤。许多where条件里涉及索引中的列,读取索引时就能被引擎检验
- Using temporary: 对查询结果排序时会使用一个临时表。
- Using filesort: 对结果使用一个外部索引排序,而不是按索引次序从表里读取行。MySQL有两种文件排序算法
- Range checked for each record: 没有好用的索引,新的索引将在连接的每一行上重新估算
- Using index for group-by:松散索引扫描,提高group by的效率。
- Backward index scan:mysql8.0对于倒序索引的优化。