具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》
访问方法(access method)的概念
- 1.MySQL执行查询语句的方式称之为访问方法或者访问类型
访问方法的类型
- 1.我们可以通过explain 来判断一个语句执行的方式。
- 2.const,ref,ref_or_null,range,index,all(查询速度越来越慢)
const(即确定肯定只有一条或者零条符合记录的数据)
- 1.针对于主键或者唯一的二级索引都可以以这种方式访问。
- 2.这种const访问方法只能在主键列或者唯一二级索引列和一个常数进行等值比较时才有效
- 3.如果主键或者唯一二级索引是由多个列构成的话,索引中的每一个列都需要与常数进行等值比较,才可以走const
- 4.因为唯一二级索引列并不限制 NULL 值的数量,所以不走const方法
ref
- 1.使用普通二级索引采用等值来匹配会在匹配记录较少的情况下走ref
- 2.如果匹配的记录太多则会变成全表扫描,因为回表代价太大(随机IO)
- 3.整个流程是从二级索引得到一系列记录,然后将这些记录去主键索引中搜索。
- 4.不论是普通的二级索引,还是唯一二级索引,它们的索引列对包含NULL值的数量并不限制,所以我们采用key IS NULL这种形式的搜索条件最多只能使用ref的访问方法,而不是const的访问方法。
- 5.对于某个包含多个索引列的二级索引来说,只要是最左边的连续索引列是与常数的等值比较就可能采用ref的访问方法对于某个包含多个索引列的二级索引来说,只要是最左边的连续索引列是与常数的等值比较就可能采用ref的访问方法
ref_or_null
- 1.找出某个二级索引列的值等于某个常数的记录,还想把该列的值为NULL的记录也找出来
range
- 1.对于范围查询(in和大于小于这些),可以采用range,当然也可以采用全表扫描
index
- 1.用遍历二级索引记录的执行方式称之为dex
- 2.经典的方式就是对于联合索引,我们查询的列,联合索引就包含但是我们的where 条件不是最左列所以只能对联合索引进行遍历
all
- 1.对主键索引的遍历
注意事项
重温 二级索引 + 回表
- 1.如果where 会有两种方式走二级索引,优化器会根据统计数据来判断走哪种索引扫描的数据较小。
- 2.例子:SELECT * FROM single_table WHERE key1 = 'abc' AND key2 > 1000;
- 3.上述例子假如走key1索引然后得到符合条件的记录(记录的主键),然后回到主键索引
- 4.根据在二级索引找到的记录找到完整记录再根据key2的条件筛选。
一般情况下where条件如果用到多个二级索引,只会使用其中一个,然后其他条件都是等到回表时候进行匹配
索引合并
Intersection(交集)合并
- 1.虽然读取多个二级索引比读取一个二级索引消耗性能,但是读取二级索引的操作是顺序I/O,而回表操作是随机I/O
- 2.二级索引列是等值匹配的情况,或者对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只匹配部分列的情况。
- 3.主键是索引范围,二级索引是等值
- 4.具体是否合并索引查询,还是看查询代价。
- 5.之所以在二级索引列都是等值匹配的情况下才可能使用Intersection索引合并,是因为只有在这种情况下根据二级索引查询出的结果集是按照主键值排序的。
排好序的两个集合取交集很快,如果未排好序的则需要一定时间才能匹配交集。
Union(并集)合并
- 1.二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只出现匹配部分列的情况
- 2.主键列可以是范围匹配
- 3.使用Intersection索引合并的搜索条件
- 4.具体是否合并索引查询,还是看查询代价。
Sort-Union合并
- 1.我们把上述这种先按照二级索引记录的主键值进行排序,之后按照Union索引合并方式执行的方式称之为Sort-Union索引合并,
很显然,这种Sort-Union索引合并比单纯的Union索引合并多了一步对二级索引记录的主键值排序的过程
索引合并注意事项
- 1.可以使用联合索引替代Intersection索引合并