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 infobright的安装步骤
Apr 07 MySQL
详解MySQL的Seconds_Behind_Master
May 18 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
MySQL数据库⾼可⽤HA实现小结
Jan 22 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 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验证码函数的使用示例
2013/05/03 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
javascript URL编码和解码使用说明
2010/04/12 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
js实现图片轮播效果
2015/12/19 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
2018/10/23 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
python把转列表为集合的方法
2019/06/28 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
中专自荐信
2013/10/13 职场文书
初中生自我评价
2014/02/01 职场文书
服务承诺书格式
2014/05/21 职场文书
小学教师年度个人总结
2015/02/05 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书