【连接查询的过程】
步骤1:先确定第一个需求查询的表(驱动表),驱动表根据where条件进行筛选。
步骤2:被关联的表(被驱动表),从驱动表每查询到一条记录,就去被驱动表查询匹配的记录(筛选条件是on 和 where )
内连接:inner join 驱动表中的记录在被驱动表中找不到,则该记录不会写入最后的结果集
外连接:outer join 驱动表中的记录在被驱动表中找不到,也会写入结果集(被驱动表记录的各个字段使用NULL填充)。 左外连接、右外连接
不管内连接还是外连接,驱动表都只会被访问一遍,而被驱动表的访问次数取决于驱动表执行单表查询后的结果集中的记录数。
【基于块的嵌套循环连接】
背景:表的数据量特别庞大的时候,反复对被驱动表进行全表扫描,磁盘I/O代价非常大。
解决方向:驱动表结果集中有多少条记录,就可能把被驱动表从磁盘加载到内存中多少次。可以在被驱动表中的记录加载到内存时,一次性地与驱动表中的多条记录进行匹配。这样减少从磁盘上加载被驱动表的代价。
Join Buffer(连接缓冲区):在执行连接查询前申请的一块固定大小的内存。先把若干条驱动表结果集的记录装在这个Join Buffer中,然后开始扫描被驱动表,每一条被驱动表的记录一次性地与Join Buffer中多条驱动表记录进行匹配。由于匹配过程在内存中完成,所以可以显著减少被驱动表地磁盘I/O代价。