概述
很长一段时间,MySQL 执行 连接 的唯一算法是
嵌套循环算法
( nested loop algorithm) 的变体 ,但是嵌套循环算法
在某些场景下非常低效,也是 MySQL 一直被诟病的一个问题。
随着 MySQL 8.0.18 的发布,MySQL Server 可以使用哈希连接
(hash join),这篇文章将会简单介绍下哈希连接
如何实现,看看在 MySQL 中它是如何工作的,何时使用它,有什么限制。
哈希连接简介
什么是哈希连接?
哈希连接是一种用于关系型数据库中的连接算法,只能用于有等连接条件的连接中(on a.b = c.b)。它通常比 嵌套循环 算法 更高效(探测端非常非常小除外),尤其是在没有命中索引的情况下。
简单来说,哈希连接算法就是先把一张小表加载到内存哈希表里,然后遍历大表的数据,逐行去哈希表中匹配符合条件的数据,返回到客户端。
(哈希表只是示例,方面理解,实际 hash 的 key 是连接的值,value 是数据行链表)
通常将 哈希连接 分为两个阶段,构建阶段(build phase)和探测阶段(probe phase)。在构建阶段,先选择合适的表作为「构建输入」,构建哈希表,然后再依次遍历另一个「探测输入」表记录去探测哈希表查找符合连接条件的记录。
以上图为例,查询城市对应的省份。我们假设 city 为 构建输入,在构建阶段,服务器构建一个 city 哈希 表 ,遍历 city 表,将行依次放进 哈希表,键为 hash(province_id),值为对应的 城市行。`
在探测阶段,服务器开始从 探测输入(province) 读取行。对于每一行都使用 hash(province.province_id) 值作为查找键探测哈希表以匹配行。
也就是&#