Const(常数级别)
只能是主键列或者唯一二级索引列与一个常数进行等值比较时才生效。---如果主键索引或者唯一二级索引的索引列由多个列构成,则只有在索引列中的每一个列都与常数进行比较时,const访问才有效。
//假设有主键 id 和唯一二级索引 unkey1
select * from table where id = 1
select * from table where unkey1 = 'XXX'
//这条语句不会是const访问方式,因为对于唯一二级索引来讲,可以有多个null值
select * from table where unique = null
Ref
搜索条件为普通二级索引列与常数进行等值比较,形成的扫描区间为单点扫描区间,采用二级索引来执行查询。---普通的二级索引列并不限制索引列的唯一性
select * from table where key = 'xxx'
- 采用二级索引列来执行查询时,每获取到一条二级索引记录,就会立刻对其执行回表操作,而不是将所有二级索引列记录的主键值收集起来再统一回表。
- 当执行 key is NULL 形式的搜索条件的查询时,最多使用Ref访问方法,不管是唯一二级索引还是普通二级索引
- 对于索引列中包含多个列的二级索引来说,只要最左边连续的列是与常数进行等值比较,就可以采用ref方法。如果最左边的列不全部是等值比较的话,它的访问方法就不能称为refi
//假设有联合索引 k1,k2,k3
select * from table where k1 = 'XXX' and k2 = 'XXX'
select * from table where k1 = 'XXX' and k2 = 'XXX'
select * from table where k1 = 'XXX' and k2 = 'XXX' and k3 = 'XXX'
ref_or_null
不仅可以找出某个二级索引的值等于某个常数的记录,而且还想把该列中值为NULL的记录也找出来。
select * from table where key1 = 'XXX' OR key1 IS NULL
- 先从idx_key索引中分别定位key1 = 'XXX' 和 key1 IS NULL的连续记录,然后找到记录对应的id列的值
- 值为NULL的记录会被放在索引的最左边
range
执行索引查询时,对应的扫描区间为若干个单点扫描区间或者范围扫描区间。
select * from table where key1 in (38,324) or (key2 >=38 and key2 < 55)
- 仅包含一个单点扫描区间的访问方法不能称为rang访问方法
- 扫描区间为(-∞,+∞)的访问方法不能称为rang访问方法
index
直接扫描全部记录的二级索引记录。---->例如覆盖索引,不用回表
//假设有联合索引 k1,k2,k3
SELECT id,k1,k2,k3 from table where k2 = 'XXX'
- 当通过全表扫描对使用InnoDB存储引擎的表执行查询时,如果添加了"ORDER BY"主键的语句,那么该语句的访问方法也会被认为是"index"
SELECT * FROM table ORDER BY id;