



select * from A left join B on A.key = B.key
复制

select * from A inner join B on A.key = B.key
复制

select * from A right join B on A.key = B.key
复制

select * from A LEFT JOIN B on A.aid = B.bid 左连接
where B.bid is null B不在A的部分
复制

select * from A RIGHT JOIN B on A.aid = B.bid 右连接
where A.aid is null A不在B的部分
复制

select * from A LEFT JOIN B on A.aid = B.bid 左连接
where B.bid is null B不在A的部分
union
select * from A RIGHT JOIN B on A.aid = B.bid 右连接
where A.aid is null A不在B的部分
复制
select * from A LEFT JOIN B on A.aid = B.bid
union
select * from A RIGHT JOIN B on A.aid = B.bid
复制

选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的单表访问方法来执行对驱动表的单表查询。
对上一步中查询驱动得到的结果集中每一条记录都被分别到被驱动表中查找匹配的记录。




5、Hash Join
Hash Join首先使用了Join Buffer,把驱动表相关字段存入内存。这一步和块嵌套循环连接套路相同。
把Join Buffer中对应的字段值生成一个散列表,保存在内存中。这一步叫build。
扫描被驱动表,对被驱动表中的相关字段进行散列并比较。这一步叫probe。
用小结果集驱动大结果集,尽量减少 join 语句中的Nested Loop循环总次数。
优先优化 Nested Loop 内层循环,因为内层循环是循环中执行次数最多的,每次循环提升很小的性能都能在整个循环中提升很大的性能。
对被驱动表的 join 字段上建立索引,并且Join ON 条件的字段应该是相同类型的。
当被驱动表的 join 字段上无法建立索引的时候,设置足够的 Join Buffer Size。
对于非主键的连接查询,如果被驱动表数据特别多,建议先使用子查询查出一个临时的结果集然后再连接。(待验证)
对于可以直接从一个表中取数据的情况。(例如同一个表中取交集,例如好友表,互相关注才是好友)这样的情况,使用 Join 效率是要高于子查询的。
InnoDB存储引擎 – 姜承尧
MySQL Join算法与调优白皮书 – 姜承尧

觉得本文有用,请转发、点赞或点击“在看” 聚焦技术与人文,分享干货,共同成长 更多内容请关注“数据与人”

文章转载自数据与人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3183次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
884次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
527次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
453次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
381次阅读
2025-04-15 14:48:05
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
338次阅读
2025-04-30 17:37:37
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
298次阅读
2025-04-15 15:27:53
SQL优化 - explain查看SQL执行计划(下)
金同学
292次阅读
2025-05-06 14:40:00
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
281次阅读
2025-04-30 12:17:54
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
281次阅读
2025-04-28 11:01:25