Mysql Explain字段解释

Mysql Explain字段解释

1. EXPLAIN简介

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 通过explain我们可以获得以下信息:

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

2. 执行计划各字段含义

2.1 id

1.id相同,执行顺序由上至下

2.id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

3.id相同不同,同时存在 id相同的可以认为是一组,同一组中从上往下执行,所有组中id大的优先执行

2.2 select_type

2.2.1 simple 简单查询 解释:此查询不包含 UNION 查询或子查询
explain select * from user ;

2.2.2 UNION 联合查询 解释:表示此查询是 UNION 的第二或随后的查询
explain select * from user union select * from user ;

2.2.3 SUBQUERY 子查询 解释:where里面包含子查询
explain select * from order_info o where id > (select b.id from user b where b.id = 1);
1、第一个 select 为 PRIMARY 最外层查询
2、第二个 select 为 SUBQUERY 子查询

2.2.4 UNION RESULT 联合查询的结果

2.2.5 PRIMARY 最外层查询

2.3 type

解释:它提供了判断查询是否高效的重要依据依据. 通过 type 字段, 我们判断此次查询是 全表扫描 还是 索引扫描等,要和Extra同时观察会更好

性能:ALL < index < range ~ index_merge < ref < eq_ref < const < system

2.3.1 ALL 解释:全表扫描

2.3.2 index

解释:表示全索引扫描 (索引覆盖)和ALL类似

1、index: 表示全索引扫描, 和 ALL 类型类似, 只不过 ALL 类型是全表扫描, 而 index 类型则仅仅扫描所有的索引, 而不扫描数据. 其实就是讲 查询条件 写上索引的字段

2、index 类型通常出现在: 所要查询的数据直接在索引树中就可以获取到, 而不需要扫描数据. 当是这种情况时, Extra 字段 会显示 Using index

3、index 类型的查询虽然不是全表扫描, 但是它扫描了所有的索引, 因此比 ALL 类型的稍快.

2.3.3 range 解释:索引范围内查询

通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中

2.3.4 index_merge 解释:合并索引,使用多个单列索引搜索

2.3.5 ref 解释:根据索引查找一个或多个值
explain select id from user where name = 'xiaoming';

2.3.6 eq_ref 解释:连接join查询时,使用primary key 或 unique类型,其实就是说索引唯一的关联查询

2.3.7 const 解释:针对主键或唯一索引的等值查询扫描,只有一行

2.3.8 system 解释:表中仅仅有一条数据,这个是特殊的const查询