EXPLAIN 结果中的type字段案例
当sql查询语句写出来之后,其实工作只完成了一小半,更重要的工作是评估写的sql的质量与效率。mysql提供了explain,它向我们展示了mysql接收到一条sql语句的执行计划。根据explain返回的结果便可以知道我们的sql写的怎么样,是否会造成查询瓶颈,同时根据结果不断的修改调整查询语句,从而完成sql优化的过程。
-
explain select * from user where id = 1;
-
下面讲解一下EXPLAIN 结果中的type字段
system
-
表中只有一条数据,这个类型是特殊的const类型系统表,少量数据,往往不需要进行磁盘IO
-
select * from user where id = 1;
-
类似于这种就是system,id是唯一主键,通过id进行查询只能查出来一条这样的数据,而且能用到索引,这个查询是非常快速的
const
-
针对主键或者唯一索引的等值查询,最多只会返回一行数据,const查询速度非常快,常量连接
-
select * from user where id = 1;
-
和system类似,因为他只读取一次即可,速度非常快
eq_ref
-
主键索引(primary key)或者非空唯一索引(unique not null)等值扫描,此类型通常出现在多表的join查询,表示对于前表的每一个结果,都只能匹配到后表的一行结果。并且查询的比较通常是=,查询效率较高
-
select * from user,order where user.id = order.id ;
ref
-
非主键非唯一索引等值扫描,此类型通常出现在多表的join查询,针对于主键索引(primary key)或者非空唯一索引(unique not null),或者使用最左前缀规则的索引
-
select * from user,order where user.id = order.id and order.id = 5;
range
-
表示索引范围扫描,通过索引字段范围获取表中部分数据记录。这个类型通常出现在=,<>,>,<,>=,<=,is null,<=>,between,in操作中
-
select * from user where user.id in (1,2,3,4);
index
- 表示全索引扫描,和All类型类似,只不过All类型是全表扫描,而index表示的是扫描全部的索引,而不扫描数据,index类型通常出现在:所要查询的数据直接在索引树中可以获取到,而不需要扫描数据,索引树扫描
ALL
- 全表扫描(full table scan),这个类型是查询性能中最差的,通常来说在查询中不应该出现ALL类型的查询,因为查询数据量非常大的情况下,对数据库是一个巨大的灾难,我们一般添加索引来避免
type扫描方式由快到慢
- system > const > eq_ref > ref > range > index > ALL
总结
- explain 就像一面镜子,有事没事写完sql记得explain一下。在写文章也发现,有很多东西和细节,想要明白清楚,也是没有那么简单的,需要对操作系统以及数据库的底层查询和运行原理要有一个清楚的理解。同时type的几种类型几乎都是基于索引之上的,因此需要对索引有个深入的了解,而且explain的结果可以指导我们更好的使用索引