访问方法(access method)的概念
MySQL
执行查询语句的方式称之为访问方法
或者访问类型
const
通过主键或者唯一二级索引列来定位一条记录
ref
通过普通的二级索引列与常数进行等值比较定位一条记录
ref_or_null
在
ref
的基础上再匹配为null的列
range
通过索引列进行范围匹配某个或某些值
此处所说的使用索引进行范围匹配中的 `索引` 可以是聚簇索引,也可以是二级索引。
index
遍历二级索引记录的执行方式称之为:
index
有一个联合索引 uk_a_b_c,现在执行这条查询语句
select a,b,c from table where b = 'xxx'
这个查询显然违背了最左匹配原则,但是可以走索引覆盖,但是需要从头到尾遍历这个联合索引
all
全表扫描执行查询的方式称之为:
all
注意事项
索引合并
MySQL
在一般情况下执行一个查询时最多只会用到单个二级索引,特殊情况下也可能在一个查询中使用到多个二级索引,这种使用到多个索引来完成一次查询的执行方法称之为:index merge
,具体的索引合并算法有下边三种。
Intersection合并
某个查询可以使用多个二级索引,将从多个二级索引中查询到的主键ID取交集
比方说下边这个查询:
SELECT * FROM single_table WHERE key1 = 'a' AND key3 = 'b';
假设这个查询使用Intersection
合并的方式执行的话,那这个过程就是这样的:
- 从
idx_key1
二级索引对应的B+
树中取出key1 = 'a'
的相关记录。 - 从
idx_key3
二级索引对应的B+
树中取出key3 = 'b'
的相关记录。 - 二级索引的记录都是由
索引列 + 主键
构成的,所以我们可以计算出这两个结果集中id
值的交集。 - 按照上一步生成的
id
值列表进行回表操作,也就是从聚簇索引中把指定id
值的完整用户记录取出来,返回给用户。
思考:为什么不取单个索引进行回表操作
查询二级索引是顺序IO,回表是随机IO,应该尽量避免随机IO