MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)


Posted in MySQL onMay 08, 2023

场景描述

以一个场景为例:

单据A:下游子表 (数据量级小)
单据B:下游主表(数据量级小)
单据C:中游子表(数据量级小)
单据D:中游主表(数据量级小)
单据E:上游子表(数据量级小)
单据F:上游主表(比其他表数据量级大)

需求:将单据F的某个字段,刷到单据A的某个字段上面。从A到F,都可以通过id连接索引的形式,来关联。但是A到F的连接顺序必须是从A到F顺序连接。比如:

这几个表的连接可以用下面的例子演示:

a join b on a.id = b.id
b join c on b.id = c.mainId
c join d on c.id = d.tableId
d join e on d.id = e.tid
e join f on e.tid = f.code

inner join 和 left join 的区别

我们写update语句的时候,肯定是想要用join连表的。但是到底是使用inner join;还是left join比较好呢?

  • left join:

select a.*,b.* from a left join b on a.id = b.id , 这两个表连接,根据后面的on条件,如果b表里面的b.id不符合 a.id = b.id ,那么a表里面的所有数据列都会给展示出来。然后b表没有这种数据,所以sql里面的 b.* 会被全部填充成null

  • inner join:

select a.*,b.* from a inner join b on a.id = b.id , 这两个表连接,根据后面on条件,如果b表里面的b.id不符合 a.id = b.id ,那么a表里面的部分数据列(不符合a.id = b.id条件的)就不会展示。

根据上面的定义,left join常用于select 语句;这是为了防止a表会少一些匹配记录,为了能展示全a表,所以使用left join。

如下图所示:

MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)

索引角度理解小结果集驱动大结果集

不管是 left join 和 inner join,都要注意小结果集驱动大结果集。a表 join b表的时候,

还是看之前例子的SQL:

select a.*,b.* from a left join b on a.id = b.id

假设a表数量级是100万条,b表数量级是100条。我这样连接,就是大表驱动小表;直接看查找次数:

在用后面on条件连接两个表的时候,首先要走B+树索引进行匹配;拿a表这100w的数量级,逐条对比 -> B+树 -> 匹配到 b表的记录。假设B+树查找b表的100条要用2次查找,那么最终查找次数就是: 100万 * 2 次

如果是小表驱动大表:

select a.*,b.* from b left join a on a.id = b.id

那么就会拿b表这100条,逐条对比 -> B+树 -> 匹配到 a表的记录。假设B+树查找a表的100w条要用3次查找,那么最终查找次数就是: 100 * 3 次

从索引匹配的角度讲,小结果集驱动大结果集的效率优化了不是一点半点。我们要有意识地让小表在左边,大表在右边

但是如果你用的是inner join,MySQL内部会做优化,自动让小表在前大表在后。也就是说你怎么写,效率都是一样的。但是left join却不能自动优化,这点需要注意!

update语句常用 inner join而不是left join

举例如下SQL:

(任务目标:用f 表字段更新a表字段)

update a 
inner join b on a.id = b.id
inner join c on b.id = c.mainId
inner join d on c.id = d.tableId
inner join e on d.id = e.tid
inner join f on e.tid = f.code
set a.Demand_orgid = f.req_org_id
where xxx = xxx;

update 原则上 都得用inner join。

看上面的SQL,假设你全部都用的left join做关联,由于你最终update 的是 a的字段;假设a表在left join的过程中,因为某个点匹配不到f表,那么用f 表字段更新a表字段 这一个过程中,一旦有任意一个环节匹配不到,那么f 表的字段全都会用null填充。最终,a表匹配不到f表的数据,都会被更新成null !

但是如果你用inner join,用f 表字段更新a表字段 这一个过程中,一旦有任意一个环节匹配不到,那么a表匹配不到 f 表的所有数据就不会显示,也就是说不会更新。

你想想,你都匹配不到数据列。你还更新啥,难道更新null吗。基于上面的原因,inner join 其实就满足需求了

况且!left join 要考虑这几张表的大小关系,谁大谁小,小结果集驱动大结果集。但是inner join 就完全不用考虑此问题,因为inner join MySQL内部会做优化,自动让小表在前大表在后。

到此这篇关于MySQL中的 inner join 和 left join的区别的文章就介绍到这了,更多相关mysql inner join 和 left join区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL中日期型单行函数代码详解
Jun 21 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
MySQL数据库 安全管理
May 06 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 MySQL
详解MySQL的内连接和外连接
May 08 #MySQL
关于MySQL中explain工具的使用
May 08 #MySQL
postgresql如何找到表中重复数据的行并删除
May 08 #MySQL
SQL Server数据库的三种创建方法汇总
May 08 #MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
May 08 #MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 #MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 #MySQL
You might like
php中常用的预定义变量小结
2012/05/09 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
用jquery快速解决IE输入框不能输入的问题
2016/10/04 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
python3处理含有中文的url方法
2018/05/10 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
Python3 合并二叉树的实现
2019/09/30 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
《晏子使楚》教学反思
2014/02/08 职场文书
会计专业自我鉴定
2014/02/10 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
客户付款通知书
2015/04/23 职场文书
文明礼仪主题班会
2015/08/13 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
详解redis在微服务领域的贡献
2021/10/16 Redis
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers