前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL8 的 Hash join 算法

MySQL8 的 Hash join 算法

作者头像
dys
发布2019-11-28 18:04:52
9330
发布2019-11-28 18:04:52
举报
文章被收录于专栏:性能与架构性能与架构

以前 MySQL 的 join 算法只有 nested loop 这一种,在 MySQL8 中推出了一种新的算法 hash join,比 nested loop 更加高效。

下面我就看看它是怎么工作的。

用这个SQL作为例子:

hash join 工作过程分为2个阶段:

  • build 构建阶段
  • probe 探测阶段

1. 构建阶段

从参与join的2个表中选一个,选择占空间小的那个表,不是行数少的,这里假设选择了 countries 表。

countries 表中每行的 join 字段值进行 hash 计算:

代码语言:javascript
复制
hash(countries.country_id)

计算后放入内存中 hash table 的相应位置。

所有行都存放到 hash table 之后,构建阶段完成。

2. 探测阶段

persons 表中每行中的 join 字段的值进行 hash 计算:

代码语言:javascript
复制
hash(persons.country_id)

拿着计算结果到内存 hash table 中进行查找匹配,找到一行就发给 client。

这样就完成了整个 join 操作,每个表只扫描一次就可以了,扫描匹配时间也是恒定的,非常高效。

这个例子中,countries 表顺利的全部放入了内存,可用内存的大小是由 join_buffer_size 控制的。

实际环境中,肯定会有比较大的表,那么超过了可用内存时怎么办呢?

需要溢出到磁盘了。

3. 溢出到磁盘

在构建阶段过程中,如果内存满了,会把表中剩余数据写到磁盘上。

不会只写入一个文件,会分成多个块文件。

MySQL 会保证每个块文件的大小都是适合可用内存的。

怎么决定某一行记录写入哪个块文件呢?也是通过hash计算join字段决定的:

代码语言:javascript
复制
hash_2(countries.country_id)

可以看到,对于大表,构建阶段分为了2步:

  • 写入内存 hash table
  • 写入块文件

然后是探测阶段,首先还是会走一遍和之前一样的流程,就是扫描一遍 persons 表的每一行,和内存中的 hash table 进行匹配。

但因为内存中的 hash table 不是全部数据,所以需要额外的处理:

persons 表的数据也写入多个块文件中。

怎么决定某一行记录写入哪个块文件呢?和构建阶段写入块文件的思路相同,这样,构建阶段的块文件和此处的块文件就是一一对应的关系了。

在正常的探测流程走完之后,开始处理这些块文件中的内容了。

逐一加载构建阶段的块文件到内存中,加载过程和正常的构建过程一致,对块文件中的每行数据进行 hash 计算,放入内存的 hash table 中。

构建好一个块文件之后,选择与其对应的探测块文件开始探测。

例如构建的是第0个构建块文件,那么就选择第0个探测块文件。

就这样一对一对的块文件进行处理,直到全部完成。

小结

hash join 算法先选一个小表,放入内存的 hash table,然后扫描另一个表,与 hash table 匹配出结果数据。

当表太大,无法一次放入内存时,就分而治之,写入块文件,再对每个块文件走一遍正常时的流程。

参考资料:

https://mysqlserverteam.com/hash-join-in-mysql-8/

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

本文分享自 JAVA高性能架构 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 构建阶段
  • 2. 探测阶段
  • 3. 溢出到磁盘
  • 小结
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档