首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL的Hash Join能用吗?

MySQL的Hash Join能用吗?

作者头像
MySQLSE
发布于 2020-09-28 07:47:04
发布于 2020-09-28 07:47:04
2K0
举报

最近有两篇MySQL大咖级人物的文章引起了小伙伴们的关注,文章内容是关于MySQL的hash join功能。hash join看起来不够智能,于是我打算一探究竟,看看是否能发现些端倪,文末解释了大咖们的关注点。

MySQL的hash join功能是在8.0.18版本正式推出的,最初的功能仅支持inner join,其它连接类型也即将支持。(空口无凭,有图为证!?)

https://dev.mysql.com/worklog/

在这里简单的介绍一下MySQL的hash join 在各种连接类型的实现方法。

inner join:

  • Classic hash join:经典的哈希连接算法分为两个阶段,构建和探测。

构建阶段:从需要进行连接的两个表中指定一个为“构建”表,该表读入内存生成哈希表,通过表的连接属性计算哈希值。例如:

SELECT * FROM t1 JOIN t2 on (t1.id = t2.id); 假设指定t1为构建表,则使用t1.id计算哈希值。

探测阶段:连接中另外的表作为探测阶段的输入使用,通过该表的连接属性计算哈希值(使用t2.id),每行数据使用其哈希值到内存中的哈希表进行查找,如果匹配记录,则输出结果。

使用经典算法要求构建表全部读入内存中,如果不能全部读入内存,将会分多次读入,会导致探测阶段产生多次读入操作。因此经典算法不是十分理想。

  • 基于磁盘的hash join:需要将构建表和探测表分割成若干个小文件保存在磁盘上,文件的大小要保证可以完全读入内存中(分割文件的算法采用与哈希表不同的哈希函数,目的是使相同哈希值的构建表和探测表的数据保存在同一文件内,并且数据的分布更加均匀)。接下来的操作和经典算法的过程差不多,每次读入一部分文件进行处理,直到所有的分割文件处理结束。

Inner non equi-join: 使用哈希连接执行该类查询,将会对两个连接表进行交叉连接,之后使用条件作为过滤。

Semijoin: 使用哈希连接执行,将会利用子查询部分作为构建表,通过连接属性计算哈希值,然后使用外部查询的连接属性的哈希值进行匹配,输出匹配的结果。

Antijoin: 与Semijoin非常相似,不同的是输出不匹配结果。

Left outer join: 左连接右侧的表为构建表。使用连接属性计算哈希值,然后使用左侧表的连接属性计算哈希值,到哈希表内进行查找,如果匹配,输出连接记录,否则输出NULL。

Right outer join: 执行方式与左连接相反。

hash join能用吗?使用效果如何?从很多人的试用反馈来看,使用hash join对比之前的查询性能大幅提高,但某些情况下会产生资源过度消耗的现象,原因在于,目前优化器还没有对hash join部分进行修改,仍旧将其视为BNL。因此出现了一些不理想的优化状态,这个问题将会在未来的工作中解决。目前可以参照叶金荣老师的文章建议。

https://mp.weixin.qq.com/s/gYledARCZHvrlnCEmh2mtw

欢迎各位小伙伴试用hash join,并反馈结果。让我们一起期待下一个版本的推出!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL解决方案工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 8.0之hash join
首先对于熟悉Oracle 的DBA 来说,hash join并不陌生,尤其涉及到多个表join时 执行计划出现 hash join ,一般来说hash join的执行效率是比 Nest Loop 要好。运维MySQL 之后DBA也对MySQL 提出支持hash join的诉求。MySQL 在8.0.18 版本终于支持hash join了。那么什么是hash join呢?
用户1278550
2020/08/21
3.9K0
join查询可以⽆限叠加吗?MySQL对join查询有什么限制吗?
假设有一个复杂的业务系统,涉及到用户表(users)、订单表(orders)、商品表(products)、物流表(logistics)和支付表(payments)。如果编写如下的 JOIN 查询:
威哥爱编程
2025/02/24
7420
MySQL Hash Join实现分析
提示:公众号展示代码会自动折行,建议横屏阅读 「前言」 连接操作是一种数据库中最基本的操作,连接算法的执行效率直接影响到整个数据库的效率、吞吐和资源。通常商业数据库系统一般有三种主流的连接实现:Nested Loop Join、Hash Join和Sort Merge Join。本文概述目前主流的Hash Join实现方式,以及分析MySQL中Hash Join的实现方式。 MySQL 8.0.18 版本增加了对Hash Join算法的支持,在此之前,连接算法仅支持嵌套循环连接 Nested Loop J
腾讯数据库技术
2021/12/30
2.7K1
MySQL Hash Join前世今生
因工作需要,对MySQL Hash Join的内部实现做了一些探索和实践,对这个由8.0.18开始引入的连接算法有了一定的了解,写文总结与各位大佬分享,欢迎大家指教。因篇幅较长,这份总结分成若干部分,我们今天先一起来看一下MySQL Hash join的变迁史。
老叶茶馆
2023/02/18
4430
MySQL Hash Join前世今生
MYSQL hash join 与MYSQL 使用为什么建议从8.018后开始
MYSQL 的hash join 是从8.018引入的, 众所周知MYSQL的JOIN 的方式一直是不大友好的,nested loop join 在针对数据表join方式中,速度是一个问题。优化的手段很多,驱动表的选择,先去除参与JOIN的数据的等等都是方法。
AustinDatabases
2021/06/10
9550
MYSQL  hash join  与MYSQL 使用为什么建议从8.018后开始
MySQL基础之Natural Join用法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
SmileNicky
2019/11/12
1.2K0
MySQL8 的 Hash join 算法
以前 MySQL 的 join 算法只有 nested loop 这一种,在 MySQL8 中推出了一种新的算法 hash join,比 nested loop 更加高效。
dys
2019/11/28
1.1K0
图文并茂详解 SQL JOIN
Join是关系型数据库系统的重要操作之一,一般关系型数据库中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑
用户1177713
2018/02/24
3.4K0
图文并茂详解 SQL JOIN
MySQL的JOIN到底是怎么玩的
在MySQL中,查询操作通常会涉及到联结不同表格,而JOIN命令则在这一过程中扮演了关键角色。在JOIN操作中,我们通常会使用三种不同的方式,分别是内连接、左连接以及右连接。
@派大星
2024/03/20
3740
MySQL的JOIN到底是怎么玩的
CMU 15-445 -- Join Algorithms - 09
本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录,附加个人拙见,同样借助CMU 15-445课程内容来完成MIT 6.830 lab内容。
大忽悠爱学习
2023/10/11
3040
CMU 15-445 -- Join Algorithms - 09
深入解析MySQL Join算法原理与性能优化实战指南
在关系型数据库中,Join的实质是按照一定的关联条件,将多个表中的数据逻辑关联起来。这个操作通常面临几个关键难点:
意疏
2025/06/13
2450
MySQL - EXPLAIN详解
EXPLAIN: 为 SELECT语句中使用到的每个表返回一条信息。它按照MySQL在处理语句时读取它们的顺序列出这些表。MySQL使用循环嵌套算法解析所有连接。意味着MySQL从第一个表中读取一行,然后在第二个表,第三个表中找到匹配的行,等等。
battcn
2018/08/03
1.5K0
MySQL - EXPLAIN详解
GPDB中的HASH JOIN解析
Hash Join是利用hash函数来实现和加速数据库中JOIN操作的一类算法。主要优势是hash函数可以只通过一次运算就将键值映射到固定大小的hash值,仅用作等值join中。由于HASH JOIN的算法复杂度在平均情况下是O(n),所以通常在大规模数据时做HASH JOIN是不错的选择。
yzsDBA
2023/02/26
4750
GPDB中的HASH JOIN解析
mysql explain ref列_MySQL EXPLAIN详解
MySQL EXPLAIN详解:http://www.jianshu.com/p/ea3fc71fdc45
全栈程序员站长
2022/11/02
4.4K0
MySQL 8.0 新特性之Hash Join
上周在公司做了针对MySQL 8.0新特性相关的分享,提到MySQL 8.0新特性,不得不提到的就是HashJoin,MySQL一直被人诟病没有实现HashJoin,从8.0.18已经带上了这个功能,令人欣喜。有时候在想,MySQL为什么一直不支持HashJoin呢?可能是因为MySQL多用于简单的OLTP场景,并且在互联网应用居多,需求没那么紧急。另一方面在8.0.18之前,MySQL只支持Nest Loop Join算法,MySQL针对这个算法做了若干优化,实现了Block NestLoop Join,Index NestLoop Join等,有了这些优化,在一定程度上能缓解对HashJoin的迫切程度。本文会介绍HashJoin的原理以及在使用和不使用HashJoin的情况下,性能的差异。
SEian.G
2021/09/17
2.8K0
深入理解MySQL中的JOIN算法
码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 !
公众号:码到三十五
2024/03/24
7530
深入理解MySQL中的JOIN算法
干货分享 | SQL join 你真的懂了吗?
如果将数据存储在关系数据库中,最好将数据规范化,通常需要将数据拆分为通过键逻辑连接的多个表。大多数非简易的查询都需要多个表的连接来完成。本文简要介绍了SQL连接,重点介绍了内连接和外接之间的区别。
腾讯云数据库 TencentDB
2019/05/20
1.1K0
MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点5:表连接算法(join algorithm)
我们知道对于Oracle的表连接,根据SQL连接条件主要支持如下三种连接方法(算法):
SQLplusDB
2023/08/17
8800
MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点5:表连接算法(join algorithm)
TiDB 查询优化及调优系列(四)查询执行计划的调整及优化原理
本章节会介绍在优化器产生的查询执行计划和预期不符时,如何通过 TiDB 提供的调优手段来调整及稳定查询计划。本篇文章为查询执行计划的调整及优化原理解析,主要会介绍如何通过使用 HINT 来调整查询的执行计划,以及如何利用 TiDB SPM 来绑定查询语句的查询执行计划;最后将介绍一些规划中的功能。
PingCAP
2022/05/24
7310
[数据库基础]——图解JOIN
一、概要 JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻,这次就说说JOIN操作。 图片是很容易被接受和理解,所以尝试使用图片来说明一下。
数据分析
2018/03/01
1.1K0
[数据库基础]——图解JOIN
相关推荐
MySQL 8.0之hash join
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档