HASH JOIN

作者admin

8月 7, 2025

HASH JOIN 的概念

HASH JOIN(哈希连接)是一种 表连接算法,用于在执行 JOIN 时,将两张表中的数据匹配起来。

它的核心思想是:

先把其中一张较小的表放入内存,用某个连接键(比如 ON a.id = b.a_id)生成一个哈希表(Hash Table)。

然后扫描另一张大表,对于每一行,通过哈希表快速匹配对应的行。

这样可以减少重复扫描,提高连接效率。

MySQL 之前是没有 HASH JOIN 的

在 MySQL 8.0 之前,MySQL 主要使用:

Nested Loop Join(嵌套循环连接)
先扫描外表,然后对每一行去内表找匹配。

Block Nested Loop Join(块嵌套循环连接)
对内表分块,减少磁盘 I/O。

没有原生的 HASH JOIN,尽管 InnoDB 内部有一些哈希结构用于加速。

MySQL 8.0.18 开始引入了 HASH JOIN

从 MySQL 8.0.18 起,MySQL 的优化器可以自动选择使用 HASH JOIN,尤其是在:

没有合适索引

连接条件简单(等值连接)

小表可以放到内存里

这时,优化器会自动把 Nested Loop Join 替换成 HASH JOIN,来提升性能。

是否需要手动开启

HASH JOIN 默认是启用的,如果想强制使用或者禁用,可以通过系统变量控制:

SET optimizer_switch=’hash_join=on’;
SET optimizer_switch=’hash_join=off’;

或者通过 EXPLAIN 查看执行计划时,可以看到:

Join Algorithm: Hash Join

示例

SELECT *
FROM orders o
JOIN customers c
ON o.customer_id = c.id;

 

  • 如果 customers 表很小,MySQL 会把它放进哈希表

  • 然后扫描 orders 表,用哈希表匹配 customer_id

 

在低版本 MySQL 的替代方案

若你的 MySQL 没有 HASH JOIN:

✅ 如果只需要判断是否存在匹配:用 EXISTS,比 JOIN 效率高一些

✅ 若需要关联列且没有索引:只能建索引或考虑分步查询

✅ 可以用临时表(手动分块、模拟哈希表)

作者 admin

百度广告效果展示