简介
JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
select *
from t join t2
on t.id = t2.id;
类型
- (INNER) JOIN,内连接,只连接匹配的行。
- LEFT (OUTER) JOIN,左外连接,返回左表的全部行和右表满足 ON 条件的行,如果左表的行在右表中没有匹配,那么留作 NULL.
- RIGHT (OUTER) JOIN,右外连接。
- FULL (OUTER) JOIN,全连接,mysql 中不支持。
TiDB 中的实现方式
- Hash Join,选择一个 inner 表来构造哈希表,然后对 outer 表的每一行数据都去这个哈希表中查找是否有匹配的数据。
- Index Lookup Join,每次取得 outer 表中的一批数据,使用索引在 inner 表中进行快速匹配。
- 从 Outer 表中取一批数据,设为 B;
- 通过 Join Key 以及 B 中的数据构造 Inner 表取值范围,只读取对应取值范围的数据,设为 S;
- 对 B 中的每一行数据,与 S 中的每一条数据执行 Join 操作并输出结果;
- 重复步骤 1,2,3,直至遍历完 Outer 表中的所有数据。
- Sort Merge Join,将 Join 的两个表,首先根据连接属性进行排序,然后进行一次扫描归并, 进而就可以得出最后的结果。
一般在连接列为索引列的情况下可以考虑选择使用 SMJ。