Mysql执行查询语句的方式称为访问方法或访问类型,有两种大方向全表查询或索引查询,细分可分为const,ref
索引查询
先从B+树查找到对应的非叶子节点,根据得到的非叶子节点查询到主键值回查聚簇索引得到聚簇索引树上的叶子节点信息,上面存储了目标记录所有信息;如果搜索条件为多个不同的索引列,会先分别查询各个索引数将得到的主键取交集
- 主键或唯一二级索引的等值查询:单结果
- 普通二级索引的等值查询:多结果
- 索引列的范围查询:多结果
- 扫描整个索引:多结果
const
适用于:定位唯一记录,如果查询条件为null值,那么不使用const访问方法执行
- 在主键列或者唯一二级索引列和一个常数进行等值比较时生效
- 在主键列或唯一二级索引,二级索引是由多个列组成,那这多个列都要与常数进行等值比较
ref
适用于:定位较少的记录
- 普通二级索引的等值查询
- 普通二级索引或唯一二级索引搜索条件为is null
- 二级索引包含多个索引列,最左边的连续索引列是与常数的等值比较
- 二级索引包含多个索引列,最左边的列是与常数的等值比较 ,其他列不是没关系
ref_or_null
适用于:索引列同时查询等值和范围查
range
适用于:利用索引(不讲究索引类型)进行多个范围匹配
只要索引列和常数使用=
、<=>
、IN
、NOT IN
、IS NULL
、IS NOT NULL
、>
、<
、>=
、<=
、BETWEEN
、!=
(不等于也可以写成<>
)或者LIKE
操作符连接起来,就可以产生一个所谓的区间
。
index
适用于:遍历二级索引记录
- 查询列表包含的列是索引,搜索条件列也是索引列,多列索引匹配成功也可以
all
全表扫描,直接扫描聚簇索引
索引不生效,直接全表扫描
- 搜索条件中索引列和非索引列or连接
索引合并
-
Intersection交集合并:搜索条件由多个索引列组合,先从各自的B+树中找到相关的记录,然后计算得到的所有主键的交集,按照得到的最后的主键值进行回表操作。因为这主要考虑到回表的性能损耗,如果根据某个搜索条件后回表过滤另一个搜索条件,读取多个二级索引后得到的交集比读取一个二级索引就去回表的成本低:回表操作时随机I/O,读取二级索引的操作是顺序I/O且交集数量少,时间复杂度是O(n)。TODO 取交集过程
- 适用于:需要回表的数据较少。二级索引列等值查询,不能是范围匹配;多列索引均出现在搜索条件中;主键列可以范围匹配;
-
Union合并:索引列之间or关系且等值匹配,主键索引可以范围匹配,联合索引需要全员参与搜索条件
-
Sort-Union合并:比union索引合并多了一步对二级索引记录的主键排序