MySQL 连接原理

本文将介绍 MySQL 中连接的原理。

一、连接语法

内连接:

1
2
3
4
5
SELECT 列 FROM 表 INNER JOIN 表2 [on 连接条件] [WHERE 过滤条件]

SELECT 列 FROM 表 JOIN 表2 [on 连接条件] [WHERE 过滤条件]

SELECT 列 FROM 表, 表2 [WHERE 过滤条件]

左外连接:

1
SELECT 列 FROM 表 LEFT JOIN 表2 on 连接条件 [WHERE 过滤条件]

右外连接:

1
SELECT 列 FROM 表 RIGHT JOIN 表2 on 连接条件 [WHERE 过滤条件]

全外连接:

MySQL 不支持。

二、驱动表和被驱动表

将连接时,语句中的 “前表” 称为驱动表,”后表” 称为被驱动表。

对于内连接,驱动表的选取会影响查询过程,但不会影响查询结果;

对于外连接,驱动表的选取会影响查询过程,也会影响查询结果。

三、查询过程

能够利用索引

  • 根据 “针对驱动表的条件” 对驱动表执行查询
  • 遍历第一步的每条查询结果,根据 “针对两张表的条件” 到被驱动表中查询匹配的记录,将符合条件的两行拼接放入结果集

不能利用索引

  • 根据 “针对驱动表的条件” 对驱动表执行查询,将所有结果放入内存中的 join_buffer
  • 遍历查询被驱动表,取出每一行,与 join_buffer 中的数据做条件判断,将符合条件的两行拼接放入结果集

四、说明

  • 驱动表只会被查询一次,被驱动表可能会查询 n 次
  • 对于外连接中的过滤条件,当根据连接条件无法在被驱动表中查询到匹配的记录时,仍会将驱动表中的对应记录添加至结果中,并将(应从被驱动表中获取的)空缺的列设为 null
  • 应该让小表做驱动表

参考

  • MySQL 技术内幕
  • MySQL 实战 45 讲
  • MySQL 是怎样运行的:从根儿上理解 MySQL