单表查询
类别
- 全表扫描
- 利用索引
执行查询语句的方式叫做访问方法。
访问方法
const
非NULL值情况下的值匹配:
select * from table1 where c = 1
#1是常数
当列c是主键或者唯一索引(unique)的时候,查询会非常迅速,即使是索引查询也只需要回表一次。
ref
select * from table1 where c = 1
#1是常数
当列c是普通二级索引时,查找也很快,查找一个索引,然后回表。
这个情况下,如果比较值是NULL,也是算作ref的。
ref_of_null
从名字就可以知道,不仅满足ref的条件,还想查出所有的NULL的记录:
select * from table1 where c = 1 AND c IS NULL
#1是常数
得到的是两个连续的索引记录范围。
range
范围查询。
index
这个是充分利用索引的一个例子
如果有一个联合索引是:a b c列
而查询语句中,查询的列是a b c列,而条件只有b列,
那么为了防止全表查询,利用此联合索引的全覆盖:
MySQL会遍历索引的所有叶节点,并筛选其中满足b列条件的节点,返回用户(此处不需要回表)。
索引合并
有些情况,查询是会用到多个索引的,这就是索引合并:
Intersection合并
某个查询可以使用多个二级索引,将从多个二级索引中查询到的结果取交集。
多个条件中分别使用到了索引,那么每一个条件都去利用索引得到一个主键集合。最后将集合做交集,然后回表。
特定情况下才会产生intersection合并:
- 二级索引列是等值匹配的情况(必须索引的每一个列都出现,并且都是等值匹配)。
- 当主键是范围查询的时候,也是可以的。
Union合并
取并集,OR条件语句。
情况:
- 二级索引列是等值匹配的情况(和Intersection合并的条件1一样)。
- 主键列范围查询。
- 条件中还有AND而且满足
Intersection索引合并的搜索条件。
Sort-Union合并
where k < 1 OR x > 2
上面的sql语句,如果k x 分别是两个索引的列,则是可以进行Sort-Union的,
首先,k < 1条件,查询到一组主键,进行排序。
其次,x > 2条件,查询到一组主键,进行排序。
最后,两组主键进行合并,回表。