SQL中 left join 的底层原理
介绍
left join的实现效果就是保留左表的全部信息,将右表往左表上拼接,如果拼不上则为NULL。
除了left join以外,还有inner join、outer join、right join等,文章不介绍其他连接的具体效果,主要讲解join的底层原理是如何实现的?具体效果是怎样呈现的?
只有懂得了底层原理,才能更好的写出性能优越的SQL脚本,提高SQL的执行速度。
join主要有3种方式,具体为:
- Nested Loop -- 嵌套循环,细分为以下3种连接方式:
- Simple Nested-Loop Join
- Index Nested-Loop Join
- Block Nested-Loop Join
 
- Hash Join
- Merge Join
其他概念:
驱动表(也叫外表)和被驱动表(也叫非驱动表,还可以叫匹配表,亦可叫内表),简单来说,驱动表就是主表,left join 中的左表就是驱动表,right join 中的右表是驱动表。
一个是驱动表,那另一个就只能是非驱动表,在 join 的过程中,其实就是从驱动表里面依次(注意理解这里面的依次)取出每一个值,然后去非驱动表里面进行匹配。
Simple Nested-Loop Join
Simple Nested-Loop Join是这三种方法里面最简单,最好理解,也是最符合大家认知的一种连接方式。
现在有两张表 table A和table B,我们让table A left join table B,观察是怎样进行匹配的。
 
从驱动表table A中依次取出每一个值,然后去非驱动表table B中进行从上往下依次匹配,将值返回。
利用这种方式进行匹配,总共需要执行10×10=100次查询。
Index Nested-Loop Join
利用索引进行匹配,Index要求非驱动表上具有索引,有了索引以后可以减少匹配次数,提高查询效率。
数据库中索引一般采用B+树的存储结构,可以提高效率。
如果索引是主键的话,效率会更高,因为主键必须是唯一的。所以如果被驱动表是用主键去连接,只会出现多对一或者一对一的情况,而不会出现多对多和一对多的情况。
Block Nested-Loop Join
理想情况下,用索引匹配是最高效的一种方式,但是在现实工作中,并不是所有的列都是索引列,这个时候就需要用到 Block Nested-Loop Join 方法了,这种方法与第一种方法比较类似,唯一的区别就是会把驱动表中 left join 涉及到的所有列(不止是用来on的列,还有select部分的列)先取出来放到一个缓存区域,然后再去和非驱动表进行匹配,这种方法和第一种方法相比所需要的匹配次数是一样的,差别就在于驱动表的列数不同,也就是数据量的多少不同。
所以虽然匹配次数没有减少,但是总体的查询性能还是有提升的。
参考链接:SQL底层原理
SQL中 left join 的底层原理的更多相关文章
- sql中的join
		首先准备数据 有以下数据,三张表:role(角色表).hero(英雄表).skill(技能表),我们以英雄联盟的数据做示例 一个hero对应一个role(我们这里暂定) 一个role可以对应多个her ... 
- SQL中inner join、outer join和cross join的区别
		对于SQL中inner join.outer join和cross join的区别简介:现有两张表,Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同 ... 
- SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
		前言: 今天主要的内容是要讲解SQL中关于Join.Inner Join.Left Join.Right Join.Full Join.On. Where区别和用法,不用我说其实前面的这些基本SQL语 ... 
- 【转载】SQL中inner join、outer join和cross join的区别
		对于SQL中inner join.outer join和cross join的区别很多人不知道,我也是别人问起,才查找资料看了下,跟自己之前的认识差不多, 如果你使用join连表,缺陷的情况下是inn ... 
- LINQ TO SQL 中的join(转帖)
		http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html join对于喜欢写SQL的朋友来说还是比较实用,也比较容易接受的东西 ... 
- SQL中的JOIN语法详解
		参考以下两篇博客: 第一个是 sql语法:inner join on, left join on, right join on详细使用方法 讲了 inner join, left join, righ ... 
- Access SQL中Left Join、Right Join和Inner Join的使用
		1.表结构 表A 表B 2.Left Join 示例:2.1 Select * From A left join B on A. ... 
- 一条查询sql的执行流程和底层原理
		1.一条查询SQL执行流程图 2.查询SQL执行流程之发送SQL请求 (1)客户端按照Mysql通信协议将SQL发送到服务端,SQL到达服务端后,服务端会单起一个线程执行SQL. (2)执行时Mysq ... 
- SQL中的Join和Where的区别
		一.sql语句中left join.inner join中的on与where的区别 0.各种join操作的概念和作用 left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. ... 
随机推荐
- Mac下持续集成-Mac下Tomcat+Jenkins集成环境搭建
			一.MAC安装jdk及环境变量配置 1)访问Oracle官网 http://www.oracle.com,浏览到首页的底部菜单 ,然后按下图提示操作: 2)下载完成后点击安装包,按提示即可完成安装. ... 
- matlab中如何给一个矩阵中的某几个特定位置赋值
			用sub2ind >> a=zeros(5); i = [2;3;4]; j = [1;4;2]; >> a(sub2ind(size(a), i, j))=1 a = 0 0 ... 
- 同步pod容器内时区
			同步pod容器内时区 .直接修改镜像的时间设置,好处是应用部署时无需做特殊设置,但是需要手动构建Docker镜像. .部署应用时,单独读取主机的“/etc/localtime”文件,即创建pod时同步 ... 
- 前端学习(一) html介绍和head标签
			HTML 一. HTML 介绍 1. HTML概述:html全称Hyper Text Mackeup Language, 翻译为超文本标记语言, 它不是一种编程语言, 是一种描述性的标记语言, 用于描 ... 
- sql如何判断表字段是否存在默认值
			if exists(SELECT 1 FROM sys.tables t INNER JOIN sys.columns c ON ... 
- 自动化运维:(2)Shell 编程的流程控制
			一. if语句 1.单分支if语句——单一条件,只有一个输出 #!/bin/bash # 单if语句的使用场景 if [ "$1" == "nan" ] the ... 
- 英特尔®oneAPI简介及动手实验研讨会召集令
			Intel Developer Zone 2019年超级计算大会英特尔正式发布了oneAPI软件行业计划及其beta产品,在上篇文章中我们已为您介绍了oneAPI的基本含义,本文将继续为您介绍oneA ... 
- 架构模式: 命令查询职责分离 (CQRS)
			架构模式: 命令查询职责分离 (CQRS) 问题 如何在微服务架构中实现查询 结论 将应用程序拆分为两部分:命令端和查询端.命令端处理创建,更新和删除请求,并在数据更改时发出事件.查询端通过对一个或多 ... 
- web安全checklist
			web安全漏洞场景分析 输入输出检验不充分 设计缺陷 环境缺陷 
- 【并行计算-CUDA开发】浅谈GPU并行计算新趋势
			随着GPU的可编程性不断增强,GPU的应用能力已经远远超出了图形渲染任务,利用GPU完成通用计算的研究逐渐活跃起来,将GPU用于图形渲染以外领域的计算成为GPGPU(General Purpose c ... 
