MySQL8开始新增hash join, 基本原理是对于等值join条件key, 将驱动表的key计算hash值后放入内存hash表内, 然后遍历被驱动表,并在hash表中查找符合join的数据。 下文仅介绍了3种nested loop join。

1\. 使用

join 是 MySQL 用来进行联表操作的,用来匹配两个表的数据,筛选并合并出符合我们要求的结果集。

join 操作有多种方式,取决于最终数据的合并效果。

比如有:

MySQL-Join

在多表关联时我们经常用到 join,那么它的底层原理是怎样的?是如何进行关联的?

这个要看各个关系型数据库的实现方式,不同的数据库不一样,有的数据库有哈希连接和或者合并连接。像 Oracle 和 MySQL 都使用了嵌套循环(Nested-Loop Join)的实现方式。

我们这边探讨一下 MySQL 的实现。

2\. 原理

Nested-Loop Join 算法,需要区分驱动表和被驱动表,先访问驱动表,筛选出结果集,然后将这个结果集作为循环的基础,访问被驱动表过滤出需要的数据。

算法这两种表分为驱动表和被驱动表,使用嵌套循环。驱动表在外循环,被驱动表在内循环。

不同 Nested-Loop Join ,讨论其实是对内循环的优化。

为了更专注于 Nested-Loop Join 的讨论,我们这里的 join 操作都不带 where 子句对结果集进行过滤。所以默认驱动表的结果集就是整张表的数据。

2.1. SNLJ

SNLJ,Simple Nested-Loop Join,简单嵌套循环。这是最简单的方案,性能也一般。对内循环没优化。