我们来学mysql -- EXPLAIN之type(原理篇)
EXPLAIN之type
- 题记
- 示例表
- type
题记
- 书接上文《 EXPLAIN之select_type》
- 2024美国大选已定,川普剑登上铁王座,在此过程中出谋划策的幕僚很重要,是他们决定了最终的执行计划
- 在《查询成本之索引选择》中提到,explain的输出,就是优化器(幕僚)选择的执行计划
- 除了SELECT开头的查询,DELETE、INSERT、UPDATE也都有执行计划,这里只关注SELECT
- 从输出的计划中可见很多字段,传达了什么样的信息,接下来看type
- 同时这里约束如何描述查询条件
- 字段 = 值 ,字段 > 值,字段 in (值1,值2)
- 字段 + 操作符 + 值 = 查询条件
示例表
-
字段
-
索引
type
-
传达的信息就是《查询成本之索引选择》提到执行计划的访问方法
-
就是说,有无使用了索引,是聚簇还是二级
-
说人话呢,用字典查字,是从目录找,还是一页页查
-
all访问方法
- 从第一页开始查,查到为止(全表扫描),不叼索引
-
const访问方法
- 通过主键或者唯一二级索引与常数进行匹配
- 按人话说就是:
-
id(主键-聚簇索引)或某个编号(唯一二级索引)字段通过等号操作符作为查询条件
EXPLAIN select * from ucoding where id = 7
EXPLAIN select * from ucoding where k2 = '10'
-
-
ref访问方法
- 普通二级索引列与常量等值匹配
- 按人话说就是:
- 姓名(普通二级索引,会有重复)字段+等号操作符构建出查询条件
EXPLAIN select * from ucoding where k1 = 'Ra309'
- 姓名(普通二级索引,会有重复)字段+等号操作符构建出查询条件
-
range访问方法
- 看了上面的例子,估计有点飘了,仔细一都是等号操作符
- 等号操作符扫索引只是形成单点扫描区域,参考《使用索引》
- 如 id = 7 , 单点扫描区域是[7,7]
- 扫描索引,获取多个单点扫描区间的索引记录,或者范围扫描区间的索引记录
- 按人话咋说?词穷了…如图表示
-
[3600,3600] 一个单点扫描区间
-
[3400,3400],[3600,3600] 多个个单点扫描区间
-
[1200,1300],[3600,3600] 范围扫描区间
-
EXPLAIN select * from ucoding where k1 in ('Ra309','Wcc4d')
-
select k1 from ucoding where 1 <= id and id <= 20
-