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查询