💡 有理想,但不|

navyum

园龄:4个月粉丝:0关注:0

13.连表查询-join

连接的本质:

  • 把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户

示意图:

图片

连接的类型:

  • 根据驱动表中的记录在被驱动表中无匹配时,是否加入到最后的结果集分为:
    • 内连接INNER JOIN:不加入结果集
    • 外连接:加入结果集
  • 根据驱动表选择分为:
    • 左外连接 LEFT JOIN:选取左侧的表为驱动表
    • 右外连接 RIGHT JOIN:选取右侧的表为驱动表

条件过滤:

  • WHERE:不论是内连接还是外连接,凡是不符合WHERE子句中的过滤条件的记录都不会被加入最后的结果集
  • ON :对于外连接的驱动表,如果无法在被驱动表中找到匹配ON子句中的过滤条件的记录,那么该记录仍然会被加入到结果集中并使用NULL值填充(如果用在内连接中,则跟where没区别

嵌套循环连接(Nested-Loop Join):

  • 步骤:
    1. 选取驱动表,使用与驱动表相关的过滤条件选取代价最低的单表访问方法来执行对驱动表的单表查询。
    2. 对上一步骤中查询驱动表得到的结果集中每一条记录,都分别到被驱动表中查找匹配的记录。
  • 驱动表只访问一次,被驱动表却可能被多次访问,访问次数取决于对驱动表执行单表查询后的结果集中的记录条数。这种连接执行方式称之为嵌套循环连接 图片

基于块的嵌套循环连接(Block Nested-Loop Join):

  • 使用join buffer 来减少被驱动表的磁盘IO次数
  • 核心思想:两个表各自先查询独自仅有的条件,然后再一次性比较连接的条件
  • join buffer:执行连接查询前申请的一块固定大小的内存。
    • 先把若干条驱动表结果集中的记录装在这个join buffer
    • 然后开始扫描被驱动表
    • 每一条被驱动表的记录一次性和join buffer中的多条驱动表记录做匹配
  • join buffer优点:因为匹配的过程都是在内存中完成的,所以这样可以显著减少被驱动表的I/O代价 图片

本文作者:navyum

本文链接:https://www.cnblogs.com/navyum/p/18509405

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   navyum  阅读(2)  评论(0编辑  收藏  举报
//自己上传到博客园的js
点击右上角即可分享
微信分享提示