left join 最后一条_你真的了解MySQL 的 join 功能?

本文深入探讨了MySQL的JOIN操作,包括Nested Loop Join(Index Nested-Loop Join和Block Nested-Loop Join)、Hash Join和Sorted Merge Join算法。通过实例分析了各种JOIN的执行流程和性能影响,强调了小表驱动大表的重要性,并解释了为何避免多表JOIN的规范。此外,还讨论了不同数据库系统如Oracle和Spark在JOIN实现上的差异。
摘要由CSDN通过智能技术生成

d4a7a09aa2e7f28d597b74036960d05c.png

分享架构师全套视频,50G资料,涵盖所有框架知识点,最牛逼技术栈!

(西0104)

关于MySQL 的 join,大家一定了解过很多它的“轶事趣闻”,比如两表 join 要小表驱动大表,阿里开发者规范禁止三张表以上的 join 操作,MySQL 的 join 功能弱爆了等等。这些规范或者言论亦真亦假,时对时错,需要大家自己对 join 有深入的了解后才能清楚地理解。下面,我们就来全面的了解一下 MySQL 的 join 操作。

    下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。

8852697c0a2eb49f51e74d1931ccc119.png 

具体分解如下:

1、INNER JOIN(内连接)

b32b843cb50cc4332124db7a43058fa1.png

SELECT 
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

2、LEFT JOIN(左连接)

d40b06eb7822205022a77b3b7b873364.png

SELECT 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

3、RIGHT JOIN(右连接)

1af2ee3ae4e7ed16b973334af37f8027.png

SELECT 
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

4、OUTER JOIN(外连接)

a495e3e1141bcf218d1de6ac5cc1b710.png

SELECT 
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

5、LEFT JOIN EXCLUDING INNER JOIN(左连接-内连接)

d9c5744d321f3aa5aa85be9b1e17690f.png

SELECT 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

6.RIGHT JOIN EXCLUDING INNER JOIN(右连接-内连接)

b06437683ea8d01d7acb7bb1b5c66371.png

SELECT 
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

7、OUTER JOIN EXCLUDING INNER JOIN(外连接-内连接)

fdc391b2f2855baf7082200a7d8c07c2.png 

SELECT 
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

WHERE A.Key IS NULL OR B.Key IS NULL

Sql 中 left join 的底层原理

写过或者学过 Sql 的人应该都知道 left join,知道 left join 的实现的效果,就是保留左表的全部信息,然后把右表往左表上拼接,如果拼不上就是 null。除了 left join以外,还有inner join、outer join、right join,这些不同的 join 能达到的什么样的效果,大家应该都了解了,如果不了解的可以看看网上的帖子或者随便一本 Sql 书都有讲的。今天我们不讲这些 join 能达到什么效果,我们主要讲这些 join 的底层原理是怎么实现的,也就是具体的效果是怎么呈现出来的。

为什么要讲底层原理呢?因为只有懂底层原理了,才知道如何更好的去写 join 语句,最后才能提高 select 的查询速度。

join 主要有Nested Loop、Hash Join、Merge Join这三种方式,我们这里只讲最普遍的,也是最好的理解的Nested Loop,Nested Loop 翻译过来就是嵌套循环的意思,那什么又是嵌套循环呢?嵌套大家应该都能理解,就是一层套一层;那循环呢,你可以理解成是 for 循环。

Nested Loop 里面又有三种细分的连接方式,分别是Simple Nested-Loop Join、Index Nested-Loop Join、Block Nested-Loop Join,接下来我们就分别去看一下这三种细分的连接方式。

在正式开始之前,先介绍两个概念,驱动表(也叫外表)和被驱动表(也叫非驱动表,还可以叫匹配表,亦可叫内表),简单来说,驱动表就是主表,left join 中的左表就是驱动表,right join 中的右表是驱动表。一个是驱动表,那另一个就只能是非驱动表了,在 join 的过程中,其实就是从驱动表里面依次(注意理解这里面的依次)取出每一个值,然后去非驱动表里面进行匹配,那具体是怎么匹配的呢?这就是我们接下来讲的这三种连接方式。

01.Simple Nested-Loop Join

Simple Nested-Loop Join 是这三种方法里面最简单,最好理解,也是最符合大家认知的一种连接方式,现在有两张表table A 和 table B,我们让 table A left join table B,如果是用第一种连接方式去实现的话,会是怎么去匹配的呢?直接上图:

7389bfb6684d0eb7c3a6a1720d6cd591.png

上面的 left join 会从驱动表 table A 中依次取出每一个值,然后去非驱动表 table B 中从上往下依次匹配,然后把匹配到的值进行返回,最后把所有返回值进行合并,这样我们就查找到了table A left join table B的结果。是不是和你的认知是一样的呢?利用这种方法,如果 table A 有10行,table B 有10行,总共需要执行10 x 10 = 100次查询。

这种暴力匹配的方式在数据库中一般不使用。

02.Index Nested-Loop Join

Index Nested-Loop Join 这种方法中,我们看到了 Index,大家应该都知道这个就是索引的意思,这个 Index 是要求非驱动表上要有索引,有了索引以后可以减少匹配次数,匹配次数减少了就可以提高查询的效率了。

为什么会有了索引以后可以减少查询的次数呢?这个其实就涉及到数据结构里面的一些知识了,给大家举个例子就清楚了。

6183411acddbf8aefb2e70ef5657fd3d.png

上图中左边就是普通列的存储方式,右边是树结构索引,什么是树结构呢?就是数据分布的像树这样一层一层的,树结构有一个特点就是左边的数据小于顶点的数,右边的数大于顶点的数,你看右图中,左边的数3是不是小于顶点6,右边的数7是不是大于顶点6;左边的数1是不是小于顶点3,右边的数4是不是大于顶点3。

假如我们现在要匹配数值9,如果是左边这种数据存储方式的话,我们需要从第一行依次匹配到最后一行才能找到数值9,总共需要匹配7次;但是如果我们是用右边这种树结构索引的话

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值