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多表查询-笔记七
Apr 05 MySQL
mysql 8.0.24版本安装配置方法图文教程
May 12 MySQL
MySql新手入门的基本操作汇总
May 13 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
MySQL注入基础练习
May 30 MySQL
解析MySQL binlog
Jun 11 MySQL
mysql备份策略的实现(全量备份+增量备份)
Jul 07 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MYSQL如何查看操作日志详解
May 30 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通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
php之可变函数的实例详解
2017/09/13 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
Python socket编程实例详解
2015/05/27 Python
Python对数据库操作
2016/03/28 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
Python中extend和append的区别讲解
2019/01/24 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
python爬虫可以爬什么
2020/06/16 Python
python遍历路径破解表单的示例
2020/11/21 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
初三物理教学反思
2014/01/21 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
支部鉴定材料
2014/06/02 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
大学生学期个人总结
2015/02/12 职场文书
请客吃饭开场白
2015/06/01 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技