1、const
有的时候我们可以通过主键列来定位一条记录,比方说这个查询:
SELECT * FROM single_table WHERE id = 1438;
通过主键或者唯一二级索引列来定位一条记录的访问方法定义为:const
2、ref
普通的二级索引来说,通过索引列进行等值比较后可能匹配到多条连续的记录,而不是像主键或者唯一二级索引那样最多只能匹配1条记录,称为:ref方法
但是如果最左边的连续索引列并不全部是等值比较的话,它的访问方法就不能称为ref了
3、ref_or_null
不仅想找出某个二级索引列的值等于某个常数的记录,还想把该列的值为NULL的记录也找出来,就像下边这个查询:
SELECT * FROM single_table WHERE key1 = 'abc' OR key1 IS NULL;
4、range
索引列需要匹配某个或某些范围的值
5、index
采用遍历二级索引记录的执行方式称之为:index
6、all
全盘扫描
索引合并
Intersection合并(交集)
- 二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只匹配部分列的情况。
- 主键列可以是范围匹配
Union合并(并集) - 二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只出现匹配部分列的情况。
- 主键列可以是范围匹配
- 使用Intersection索引合并的搜索条件
Sort-Union合并
先按照二级索引记录的主键值进行排序,之后按照Union索引合并方式执行的方式称之为Sort-Union索引合并,很显然,这种Sort-Union索引合并比单纯的Union索引合并多了一步对二级索引记录的主键值排序的过程。
连接的概念
- 连接的本质是多表相连产生的笛卡尔积结果集
- 驱动表和被驱动表,驱动表只访问一次,被驱动表访问多次
- 内连接,左连接,右连接(inner join,left join, right join)
- 内连接中的WHERE子句和ON子句是等价的
- 左连接和右连接,必须使用ON子句来指出连接条件
- 左连接是指以左边的表为准匹配右边表内容,没内容则null取代
连接的原理 - 嵌套循环连接。(for 嵌套的方式)
- 使用索引加快连接速度。
- 基于块的嵌套循环连接。提前划出一块内存(join buffer)存储驱动表结果集中的记录,然后开始扫描被驱动表,每一条被驱动表的记录一次性和这块内存中的多条驱动表记录匹配,可以显著减少被驱动表的I/O操作。