我们知道数据库里面两表关联主要有三种常见的关联方式,即
- nested loop join
- hash join
- merge join
nested loop join在OLTP交易场景占比是最多的,常用于关联字段为主键或索引字段的情况,通过主键或索引以及loop的方式,A表可以快速查找到匹配的B表中的数据。
merge join又称为sort merge,可想而知,如果被关联的两个数据集正好是有序的,那么采用这种方式是最高效的。
hash join则是把一个表(通常为小表)放在hash内存中,进行匹配关联。
虽然知道这点简单的理解,不过当别人问起来hash join具体怎么实现的时候,发现并不能说出个一二,看来还是应该我去熟悉一下底层的原理。参考网上关于hash join原理的一二之后,也用本篇文章稍作记录,作为一个学习的过程吧~
背景概念
所谓连接(join)是通过把多个表之间某列相等的元组提取出来组成新的表。两个表如果元数目过多,逐个遍历开销就很大(这里说的其实就是nested join),哈希连接(hash join)就是一种提高连接效率的方法。
自Oracle 7.3以来就实现了hash join的技术,MySQL则是在最新的8.0版本中实现了hash join。Hash join只能用于相等连接,相对于nested loop join,hash join更适合处理大型结果集。Hash join不需要在驱动表上存在索引。
基本概述
Hash join算法的基本思想是根据小表(记为S表&#