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 效率高一些
✅ 若需要关联列且没有索引:只能建索引或考虑分步查询
✅ 可以用临时表(手动分块、模拟哈希表)