MySQL单表/连接访问方法

const

通过主键或者唯一二级索引列来定位一条记录的访问方法定义为const(常数级别,代价忽略不计)。

SELECT * FROM t WHERE id = xx;
SELECT * FROM t WHERE 唯一索引column = xx;

唯一索引A(列A,列B)
SELECT * FROM t WHERE 列A = xx AND 列B = xx;

例外:

  1. WHERE 唯一索引column IS NULL,因为唯一索引不限制NULL值数量,所以会扫描出多条记录,否则最多只是ref
  2. 多列唯一索引时,只有多列全匹配才会是const,否则最多只是ref

ref

采用二级索引来执行查询的方法称为ref。

SELECT * FROM t WHERE 普通二级索引column = xx;
SELECT * FROM t WHERE 普通二级索引column IS NULL;

唯一索引A(列A,列B)
SELECT * FROM t WHERE 列A = xx;

ref_or_null

ref_or_null访问方法只是比ref方法多扫描了一些值为NULL的二级索引记录。
值为NULL的记录会被放在索引的最左边。

SELECT * FROM t WHERE 普通二级索引column = xx OR 普通二级索引column IS NULL;

range

使用索引查询时,对应的扫描区间为若干个单点扫描区间或者范围扫描区间时,访问方法称为range。

SELECT * FROM t WHERE key1 IN (111,222) OR (key2 > 22 AND key2 <33)

注意:

  1. 只有单个扫描区间不能称为range。
  2. 扫描区间为(-∞, +∞)也不能称为range。

index

由于二级索引比聚簇索引小得多(聚簇索引要存储记录,二级索引只需要存储索引列和主键),而且这个过程不用执行回表操作,所以直接扫描全部的二级索引的访问方法称为index方法。

联合索引A(key1, key2, key3)
SELECT key2,key3 FROM t WHERE k1 = xx;

聚簇索引排序
SELECT * FROM t ORDER BY id;

all

全表扫描,直接扫描全部的聚簇索引记录。称为all访问方法。

eq_ref

在单表中使用主键值或唯一二级索引列的值进行等值查询的方式称为const。
在连接查询中使用主键值或唯一二级索引列的值进行等值查询的方式称为eq_ref。