首页/数据/数据库速查/Hash Join(8.0.18+)与联合缓冲区
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条
性能与调优57 条
Redis 命令96 条Redis 运维与场景124 条

Hash Join(8.0.18+)与联合缓冲区

无索引连表时 8.0 用 Hash Join 替代 BNL:为小表建哈希表、扫描大表探测,内存不足时落盘分批;EXPLAIN 显示 Using join buffer (hash join)。

数据库速查数据更新于 2026-10-12

观察与调参

观察与调参
EXPLAIN SELECT * FROM appdb.a JOIN appdb.b ON b.code = a.code;
-- Extra: Using join buffer (hash join)
SHOW VARIABLES LIKE 'join_buffer_size';   -- 每会话/每连表分配,慎调大
-- 8.0.18 前可用 hint:
SELECT /*+ NO_BNL() */ ... ;
替代Block Nested Loop(旧)
前提等值连表条件
内存超出 join_buffer_size 落盘,性能骤降
Hash Join 是「没索引时的补救」,不是优化目标:被驱动表有索引时 Nested Loop 往往仍更快。

易错点

  • 把 join_buffer_size 调成 GB 级:每连接独立分配,高并发直接 OOM
  • 线上看到 hash join 不治理索引:几十万行以上的哈希构建代价持续吃 CPU

数据来源与参考

  • MySQL 8.0 Reference Manual: Hash Join Optimization

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌