MySQL 连接原理
本文将介绍 MySQL 中连接的原理。
一、连接语法
内连接:
1 |
|
左外连接:
1 |
|
右外连接:
1 |
|
全外连接:
MySQL 不支持。
二、驱动表和被驱动表
将连接时,语句中的 “前表” 称为驱动表,”后表” 称为被驱动表。
对于内连接,驱动表的选取会影响查询过程,但不会影响查询结果;
对于外连接,驱动表的选取会影响查询过程,也会影响查询结果。
三、查询过程
能够利用索引
- 根据 “针对驱动表的条件” 对驱动表执行查询
- 遍历第一步的每条查询结果,根据 “针对两张表的条件” 到被驱动表中查询匹配的记录,将符合条件的两行拼接放入结果集
不能利用索引
- 根据 “针对驱动表的条件” 对驱动表执行查询,将所有结果放入内存中的 join_buffer
- 遍历查询被驱动表,取出每一行,与 join_buffer 中的数据做条件判断,将符合条件的两行拼接放入结果集
四、说明
- 驱动表只会被查询一次,被驱动表可能会查询 n 次
- 对于外连接中的过滤条件,当根据连接条件无法在被驱动表中查询到匹配的记录时,仍会将驱动表中的对应记录添加至结果中,并将(应从被驱动表中获取的)空缺的列设为 null
- 应该让小表做驱动表
参考
- MySQL 技术内幕
- MySQL 实战 45 讲
- MySQL 是怎样运行的:从根儿上理解 MySQL