第11章 两个表的亲密接触——连接的原理

连接的概念 #

连接就是把各个表中的记录都读取出来依次进行匹配,并把匹配后的组合发送给客户端。

如果不加任何过滤条件,产生的结果就是笛卡尔积。

内连接与外连接 #

内连接和外连接的根本区别就是:在驱动表中的记录不符合on子句中的连接条件时,内连接不会把该记录加入到最后的结果集中,而外连接会。

嵌套循环连接 #

嵌套循环连接短发是指驱动表只访问一次,但被驱动表却可能会被访问很多次,访问次数取决于对驱动表执行单表查询后的结果集中有多少条记录。大致过程如下:

  1. 选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的单表访问方法来执行对驱动表的单表查询。
  2. 对步骤一种查询驱动表得到的结果集中的每一条记录,都分别到被驱动表中查找匹配的记录。

由于被驱动表可能会访问多次,因此可以为被驱动表建立合适的索引以加快查询速度。

基于块的嵌套循环连接(Join Buffer) #

Join Buffer:连接缓冲区,是在执行连接查询前申请的一块固定大小的内存。

先把若干条驱动表结果集中的记录装在这个缓冲区中,然后开始扫描被驱动表,每一条被驱动表的记录一次性地与Join Buffer中的多条驱动表记录进行匹配。

设计Join Buffer的原因,是因为如果被驱动表非常大,多次访问被驱动表可能导致很多次的磁盘I/O。使用Join Buffer可以降低性能损耗。