【MySQL】左连接右连接内连接与Hash连接、子查询原理与实战(MySQL专栏启动)_左连接子查询

2、LEFT JOIN

3、RIGHT JOIN

二、MySQL数据库Hash Join

1、什么是 Hash Join

2、Hash JOIN 工作原理

三、子查询

总结


本文导读

本文介绍MySQL数据库中的左连接、右连接、内连接与Hash连接的工作原理,并分析子查询与 JOIN 的不同,根据本文所学提供一些工作中需要掌握的实战技巧。

一、MySQL数据库JOIN连接

在多个表上创建索,并且多个表JOIN和子查询语句相对比较困难。许多开发人员不自觉地认为JOIN 会降低 SQL 的性能效率,因此他们将多表 SQL 拆分为单表查询,认为这会影响SQL执行的效率,原因是开发人员不了解JOIN实现过程。

联接之间的表关联使用索引进行匹配,假设表R和表S是连接的。

表R被称为驱动表,表R中通过WHERE条件过滤的数据将在表S对应的索引上逐个查询。如果驱动表R的数据量不大,则上述算法非常有效。

以下三种 JOIN 类型,驱动表各是哪张表:

SELECT * FROM R LEFT JOIN S ON R.x = S.x WEHRE ...
SELECT * FROM R RIGHT JOIN S ON R.x = S.x WEHRE ...
SELECT * FROM R INNER JOIN S ON R.x = S.x WEHRE ...

1、inner join

对于 INNER JOIN,驱动表可能是表 R,也可能是表 S。显示左边右边共有的数据。

在这种场景下,谁需要查询的数据量越少,谁就是驱动表。 我们来看下面的例子

SELECT * FROM R INNER JOIN S  ON R.x = S.x  WHERE R.y = ? AND S.z = ?

2、LEFT JOIN

上述 Left Join 来说,驱动表就是左表 R;Right Join中,驱动表就是右表 S。这是 JOIN 类型决定左表或右表的数据一定要进行查询。

返回包括左表中的所有记录和右表中联结字段相等的记录。即使右表中没有匹配,也从左表返回所有的行。

SELECT * FROM R LEFT JOIN S  ON R.x = S.x  WHERE R.y = ? AND S.z = ?

3、RIGHT JOIN

上述 Left Join 来说,驱动表就是左表 R;Right Join中,驱动表就是右表 S。这是 JOIN 类型决定左表或右表的数据一定要进行查询。

返回包括右表中的所有记录和左表中联结字段相等的记录。即使左表中没有匹配,也从右表返回所有的行。

SELECT * FROM R RIGHT JOIN S  ON R.x = S.x  WHERE R.y = ? AND S.z = ?

二、MySQL数据库Hash Join

1、什么是 Hash Join

MySQL中的第二个 JOIN 是 Hash JOIN,当两个表之间的连接条件没有索引时使用该算法。

如果没有连接,那么创建索引可以吗?

如果某些列是选择性低的索引,则在创建索引以导入数据时必须对数据进行排序,这会影响导入性能;辅助索引将出现返回表的问题。如果过滤的数据量很大,直接全表扫描会更快。

对于OLAP业务查询(OLAP 是在线分析处理用于数据分析,它使我们能够同时分析来自多个数据库系统的信息),哈希连接是一个必不可少的功能。MySQL 8.0开始支持 Hash Join算法,加强了对 OLAP 业务的支持。

因此,如果您的查询数据量不太大,并且查询的响应时间要求在分钟级别,则可以使用单实例MySQL 8.0来完成大数据的查询。

2、Hash JOIN 工作原理

Hash JOIN出现在MySQL 8.0的执行计划中,Hash JOIN 扫描关联的两个表:首先,在扫描驱动器表的过程中创建一个哈希表;当扫描第二个表时,将在哈希表中搜索每个关联记录。如果找到,将返回记录。

哈希连接选择驱动程序表和嵌套循环连接算法,两者基本相同。两个较小的表都用作驱动程序表.如果驱动器表很大,并且创建的哈希表超过了内存大小,MySQL将自动将结果转储到磁盘。

三、子查询

我发现相当多的开发同学,包括我自己更喜欢编写子查询,而不是传统的JOIN语句。

子查询的逻辑非常清晰。虽然 JOIN 也可以满足需求,但这并不容易理解,因为LEFT JOIN是一种代数关系,子查询更倾向于从人类思维的角度来理解。

然而,在MySQL 8.0中,优化器会自动将 in 子查询优化为 JOIN 执行计划,这将显著提高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值