explain结果中的type字段代表什么意思? type

对于MySQL执行计划的获取,我们可以通过explain方式来查看,explain方式看似简单,实际上包含的内容很多,尤其是输出结果中的type类型列 。理解这些不同的类型,对于我们SQL优化举足轻重 。今天主要介绍一下常见的type结果及代表的含义,并且通过同一个SQL语句的性能差异,说明建对索引多么重要 。
explain结果中的type字段代表什么意思?
MySQL的官网解释非常简洁,只用了3个单词:连接类型(the join type) 。它描述了找到所需数据使用的扫描方式 。
一、EXPLAIN 语句中type列的值

explain结果中的type字段代表什么意思? type

文章插图


explain结果中的type字段代表什么意思? type

文章插图


效率总结
1)依次从好到差:
  • system,const,index,range,index_merge,ALL 单独查询
  • 【explain结果中的type字段代表什么意思? type】eq_ref,ref,ref_or_null all 多表join 查询
  • index_subquery unique_subquery 子查询
2)index_merge之外,其他的type只可以用到一个索引
二、system这里我在多个mysql测试过,如果是5.7以上版本的话就不是system了,而是all,即使只有一条记录 。
explain结果中的type字段代表什么意思? type

文章插图


举一个例子,内层嵌套(const)返回了一个临时表,外层嵌套从临时表查询,其扫描类型是system,也不需要走磁盘IO,速度超快 。
三、constconst扫描的条件为:
(1)命中主键(primary key)或者唯一(unique)索引;
(2)被连接的部分是一个常量(const)值;
1、数据准备:
create table t2 (id int primary key,name varchar(20)) engine=innodb; insert into t2 values(1,'hwb');insert into t2 values(2,'zhangsan');insert into t2 values(3,'xiaoming');commit;
explain结果中的type字段代表什么意思? type

文章插图


2、查看执行计划
explain select * from t2 where id=1;如上例,id是PK,连接部分是常量1 。
explain结果中的type字段代表什么意思? type

文章插图


这类扫描效率极高,返回数据量少,速度非常快 。
四、eq_refeq_ref扫描的条件为,对于前表的每一行(row),后表只有一行被扫描 。
再细化一点:
(1)join查询;
(2)命中主键(primary key)或者非空唯一(unique not null)索引;
(3)等值连接;
1、数据准备:
create table t3 (id int primary key,name varchar(20))engine=innodb; insert into t3 values(1,'hwb');insert into t3 values(2,'zhangsan');insert into t3 values(3,'xiaoming'); create table t4 (id int primary key,age int)engine=innodb; insert into t4 values(1,18);insert into t4 values(2,20);insert into t4 values(3,30);insert into t4 values(4,40);insert into t4 values(5,50);commit;
explain结果中的type字段代表什么意思? type

文章插图


2、查看执行计划
explain select * from t3,t4 where t3.id=t4.id;如上例,id是主键,该join查询为eq_ref扫描 。
explain结果中的type字段代表什么意思? type

文章插图


这类扫描的速度也异常之快 。
五、ref1、数据准备
create table t5 (id int ,name varchar(20),index(id))engine=innodb; insert into t5 values(1,'hwb');insert into t5 values(2,'zhangsan');insert into t5 values(3,'xiaoming'); create table t6 (id int,age int,index(id))engine=innodb; insert into t6 values(1,18);insert into t6 values(2,20);insert into t6 values(3,30);insert into t6 values(4,40);insert into t6 values(5,50);commit;

秒懂生活扩展阅读