explain的type几种类型详解
explain的type共有以下几种类型,system、const、eq_ref、ref、range、index、all。
1、system
应用场景:表中只有一条数据,且存储引擎可以准确的统计到这条数据。
当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system。
2、const
应用场景:通过主键或者唯一索引等值查询来定位一条数据。
比如:SELECT ID FROM student WHERE id=1 (id为自增且为主键)
就是当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const。
3、eq_ref
应用场景:在进行多表连接查询时,被驱动表通过主键或唯一索引键进行等值查询
在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的〈如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是eq_ref。
(驱动表与被驱动表: A表和B表join连接查询,如果通过A表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到B表中查询数据,然后合并结果。那么我们称A表为驱动表,B**表为被驱动表)
4、ref
应用场景:普通二级索引等值查询。
当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref。
本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他属于查找和扫描的混合体。
5、ref_or_null
应用场景:命中索引时,查询条件除了等值查询,还包含null值查询。
如:select * from t2 where key2 =4 or key2 is null;
6、index_merge
应用场景:查询条件可以命中多个索引的情况。
比如:select * from t3 where key1 =3 or key2 =4;
7、unique_subquery
应用场景:查询条件包含子查询,并且子查询的列可以进行主键等值匹配。
比如:SELECT * FROM t2 WHERE t2.key2 IN ( SELECT id FROM t3 WHERE t2.key2 = t3.key2 ) OR t2.key2 = 1;
8、index_subquery
应用场景:查询条件包含子查询,并且子查询的列可以通过索引进行等值匹配。
比如:SELECT * FROM t2 WHERE t2.key2 IN ( SELECT key1 FROM t3 WHERE t2.key2 = t3.key2 ) OR t2.key2 = 1;
index_subquery和unique_subquery的区别在于子查询中的列是唯一索引还是普通的二级索引。
9、range
应用场景:命中索引时,查询某一个范围内的结果。
比如:select * from t3 where t3.key1 >1 and t3.key1<3;
如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法,一般就是在你的where语句中出现了between、<、>、in等的查询。
这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
10、index
应用场景:直接在某个索引树上做条件判断,并且不需要回表。
比如: SELECT sno FROM student WHERE SNO=101 ;
当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index。
注意:主键数据类型为int或者varchar时,根据条件的写法type会有不同。
11、all
应用场景:直接遍历整个聚簇索引。
比如: select * from t1;
最熟悉的全表扫描,将遍历全表以找到匹配的行
不同类型性能从强到差:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2020-02-19 PPT页面切换动画