两表join怎么走联合索引_LEFT JOIN和JOIN查询区别及原理

本文介绍了MySQL的Join查询原理,包括nested loop join的三种类型:Simple NLJ、Index NLJ和Block NLJ。强调了小表驱动大表的重要性,并提出优化建议,如使用Inner Join代替Left Join,以及理解ON和WHERE子句的区别。
摘要由CSDN通过智能技术生成

参考:https://www.iteye.com/blog/luxuryzh-1976004

https://cloud.tencent.com/developer/article/1373839

一、Join查询原理

查询原理:MySQL内部采用了一种叫做 nested loop join(嵌套循环连接)的算法。Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复,基本上MySQL采用的是最容易理解的算法来实现join。所以驱动表的选择非常重要,驱动表的数据小可以显著降低扫描的行数。

一般情况下参与联合查询的两张表都会一大一小,如果是join,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是left join一般用作大表去join小表

nested loop join(嵌套循环连接)算法细分为三种:

1.Simple Nested-Loop Join

如下图,r为驱动表,s为匹配表,可以看到从r中分别取出r1、r2、......、rn去匹配s表的左右列,然后再合并数据,对s表进行了rn次访问,对数据库开销大

eedd892f2862f04b124ad9faad32e79e.png

2.Index Nested-Loop Join(索引嵌套):

这个要求非驱动表(匹配表s)上有索引,可以通过索引来减少比较,加速查询。

在查询时,驱动表(r)会根据关联字段的索引进行查找,挡在索引上找到符合的值,再回表进行查询,也就是只有当匹配到索引以后才会进行回表查询。

如果非驱动表(s)的关联健是主键的话,性能会非常高,如果不是主键,要进行多次回表查询,先关联索引,然后根据二级索引的主键ID进行回表操作,性能上比索引是主键要慢。

ea7218f5eb409f4ed976a4f96b44603d.png

3.Block Nested-Loop Join:

如果有索引,会选取第二种方式进行join,但如果join列没有索引,就会采用Block Nested-Loop Join。

可以看到中间有个join buffer缓冲区,是将驱动表的所有join相关的列都先缓存到join buffer中,然后批量与匹配表进行匹配,将第一种多次比较合并为一次,降低了非驱动表(s)的访问频率。

默认情况下join_buffer_size=256K,在查找的时候MySQL会将所有的需要的列缓存到join buffer当中,包括select的列,而不是仅仅只缓存关联列。在一个有N个JOIN关联的SQL当中会在执行时候分配N-1个join buffer。

d3e9eaa45417caa7803e8fb3a12faa42.png

二、使用原则

尽量使用inner join,避免left join 和NULL。

三、on和where的使用区别

首先要明确一点,where中的条件拿到on里去出来的结果是不同的,如下:

69b50c5788cbe6fda0f1cb0efad4fdae.png
邵老师说
关注 关注
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
full outer join 与full join区别_LEFT JOINJOIN查询区别原理
weixin_39982236的博客
11-28 1065
参考:https://www.iteye.com/blog/luxuryzh-1976004https://cloud.tencent.com/developer/article/1373839一、Join查询原理查询原理:MySQL内部采用了一种叫做 nested loop join(嵌套循环连接)的算法。Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条...
inner join on 加条件和where加条件_技术分享 | MySQL 优化:JOIN 优化实践
weixin_39670441的博客
11-28 1001
作者:胡呈清近期刚好学习了丁奇老师的《MySQL 实战 45 讲》中的 join 优化相关知识,又刚刚好碰上了一个非常切合的 join 查询需要优化,分析过程有些曲折,记录下来留作笔记。问题 SQL 描述问题 SQL 和执行计划是这样的:explain SELECT t1.stru_id AS struId, ... FROM cams_stru_info t1 LEFT ...
说说多线程中常用的几个方法
公众号:Java后端
03-29 366
点击上方Java后端,选择设为星标优质文章,及时送达Object中的wait、notify、notifyAll,可以用于线程间的通信,核心原理为借助...
mysql中多表联合查询怎样加索引
最新发布
weixin_41518094的博客
08-06 79
在 MySQL 中使用多表联合查询索引 引言 在数据库开发中,性能优化是非常重要的一环。多表联合查询常常是造成性能问题的原因之一,因此合理地使用索引是非常必要的。本篇文章将逐步引导大家如何在 MySQL 中为多表联合查询添加索引,以提高查询性能。 流程概述 在进行多表联合查询时,我们可以按照以下步骤来添加索引: 步...
sql索引的建立与使用_mysql中关于关联索引的问题
weixin_39611722的博客
12-05 306
mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会索引?情况描述:在MySQL的user表中,对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会索引?根据查询字段的位置不同来决定,如查询a, a,b a,b,c a,c 都可以索引的,其他条件的查询不能索引。组合索引 有“最左前缀”原则。就是只从最...
[学习打卡]09MySql索引的优化
weixin_45317494的博客
10-06 249
单表索引优化 示例 示例1: 索引: 效果: 示例二: 索引: 效果: 示例三: 索引: 效果: 更改了where之后的条件顺序之后索引依旧生效,效果如下: 还是实例三的索引,删除一个条件之后 效果: 只命中了一个字段,只命中了age而没有命中name 同样:替换一个之后 效果: 没有命中索引。 原因: age之后应该是deptid但是没有写所以有了第一次的那个只命中一个索引的 “...
SQL联合查询inner join、outer join和cross join区别详解
09-09
在SQL查询中,联合查询是将两个或多个表格的数据结合在一起的一种方法,主要涉及三种类型的联合:INNER JOIN、OUTER JOIN(包括LEFT JOIN、RIGHT JOIN和FULL JOIN)以及CROSS JOIN。理解这些概念对于数据库开发人员...
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
10-16
在Laravel框架中执行数据库查询时,开发者经常需要使用左连接(LEFT JOIN)来合并两个或多个表的数据。但有时,在使用带条件的左连接查询时,会遇到不返回右表中为空记录的情况,这主要是因为在查询中混合使用了...
mysql使用from与join两表查询区别总结
09-09
本文将探讨使用`FROM`和`JOIN`在进行两表查询时的区别,并通过实例分析它们的性能差异。 首先,我们创建两个表`one`和`two`,如下所示: ```sql CREATE TABLE `one` ( `id` int(0) NOT NULL AUTO_INCREMENT, `...
join 索引 oracle,pl/sql中left join 和关联子查询 索引的问题
weixin_35006181的博客
04-03 738
本帖最后由 hedvahu 于 2017-9-7 16:16 编辑现有下列sql语句,在不同的环境下执行,显示的执行计划不同,不知道什么原因:1.STAFF 员工表 索引 party_id2.PARTY_CONTACT_INFO 记录员工电话号码,索引 party_idsql语句如下:select *from STAFF jsleft join PARTY_CONTACT_INFO jpcion ...
ThinkPHP采用原生query实现关联查询left join实例
10-25
LEFT JOIN部分,`hh_typeattr`表(用`a`作为别名)被连接到`hh_siteattr`表(用`v`作为别名),基于`v.attr_id = a.id`和`v.site_id = '$site_id'`这两个条件。这意味着`hh_siteattr`中的每一行都必须有与`hh_...
mysql优化
rosemaryyoudu的博客
06-23 189
SELECT businessDate, carSum, totalMileage, totalDotSum, receivableTotalMoney , payableTotalMoney, mainAllowance, veciAllowance, profit FROM ( SELECT DATE_FORMAT(business_date, '%Y-%m-%d') AS businessDate, SUM(car_traffic_count) A.
full outer join 与full join区别_MySQL逻辑架构、SQL加载执行顺序、七种JOIN模式图解...
weixin_39594312的博客
11-30 357
逻辑架构存储引擎查看当前安装的mysql提供的存储引擎查看当前mysql默认的存储引擎MyISAM和InnoDBSQL加载执行顺序sql书写顺序mysql解析器执行的顺序 考点:mysql是从from开始解析的七种JOIN模式注意上面七种模式全部适用于Oracle数据库,MySQL数据库不支持最后两种全连接(FULL OUTER JOIN)模式,但可以通过Union来间接实现,示例如下:SELEC...
full outer join 与full join区别_SQL中JOIN时条件放在Where和On的区别
weixin_39526651的博客
11-25 826
背景SQL中JOIN子句是用于把来自两个或多个表的数据连接起来,在这个过程中可能会添加一些过滤条件。昨天有小伙伴问,如下图的这两种SQL写法查询结果是否会一样?(好像这是某一年阿里的面试题)这个问题提出来以后,多数小伙伴的回答是:查询结果应该是一样的吧,只是查询效率不一样。我当时的回答是,在Inner Join时这两种情况返回的结果是一样的,在Left、Right等情况时结果不一样。案例...
full outer join 与full join区别_Apache Flink 漫谈系列 双流JOIN
weixin_39827315的博客
11-30 6029
什么是JOINJOIN的本质是分别从N(N>=1)张表中获取不同的字段,进而得到最完整的记录行。比如我们有一个查询需求:在学生表(学号,姓名,性别),课程表(课程号,课程名,学分)和成绩表(学号,课程号,分数)中查询所有学生的姓名,课程名和考试分数。如下:为啥需要JOINJOIN的本质是数据拼接,那么如果我们将所有数据列存储在一张大表中,是不是就不需要JOIN了呢?如果真的能将所需...
full outer join 与full join区别_基础小白的SQL的JOIN语法解析
热门推荐
weixin_39564527的博客
11-30 1万+
总的来说,四种JOIN的使用/区别可以描述为:left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配full outer join 全连接,返回左右表中的所有记录在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。Joi...
full outer join 与full join区别_Join有哪几种方式?内外连接有什么区别
weixin_39533742的博客
11-29 7151
join有5中连接方式:内连接(inner join…on…)全外连接(full join…on…)左连接(left join…on…)右连接(right join…on…)交叉连接(cross join …on…)内连接(inner join… on…)select通过id将table1和table2连接起来产生一个新表,新表是由这个表的公开部分组成;如下图:内连接左外连接(left join ...
带你了解数据库中JOIN的用法
weixin_33859231的博客
04-07 565
前言 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识! 本章主要介绍数据库中Join的的用法,也是我们在使用数据库时非常基础的一个知识点。本次会介绍数据库中的inner joinleft join、right join 的用法以及它们之间的区别。 文章如有错误还请大家及时指出~ 以下都是采用mysql数据库 Join 相信大家在学习数据库的使...
写文章

热门文章

  • 中文整合包_2020年《上古卷轴5:天际重制版》新手向mod安装指南-第一章-整合包... 10886
  • 微型计算机原理8255跑马灯,单片机+74LS138译码器+跑马灯+8255A+8253方波实验详解 10099
  • 服务器系统启用flash,windows无法启动flash helper service怎么办?_网站服务器运行维护,windows,flash helper service... 8241
  • oracle换端口 sde_SDE三种连接方式 5627
  • jqc3ff继电器引脚图_固态继电器简介(1)--固态继电器的内部结构及其优缺点 4942

最新文章

  • mysql 获取非重复的第一条
  • 【高中数学/基本不等式】已知:x,y 皆大于0,且xy-x-y=3 求:2x+y的最小值?
  • 升级华为系统后手机无服务器,华为系统升级以后,非bug问题解决方案|必读|...
2024年2篇
2021年138篇
2020年21篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家九江玻璃钢雕塑市场韶关玻璃钢人物雕塑需要几天玻璃钢浮雕不锈钢人物雕塑设计宝山区玻璃钢雕塑菏泽抽象校园玻璃钢雕塑厂家大型商场美陈哪家好云浮玻璃钢艺术雕塑浙江特色商场美陈销售厂家曲阳专业玻璃钢雕塑厂家湛江人物玻璃钢卡通雕塑重庆渝北区玻璃钢雕塑临沧市玻璃钢雕塑费用南召玻璃钢雕塑价格白银人物玻璃钢雕塑制作武威玻璃钢雕塑百色玻璃钢雕塑特点湖南几何景观玻璃钢雕塑定做丽水欧式玻璃钢雕塑设计湛江玻璃钢公园雕塑昭通玻璃钢商场美陈雕塑师玻璃钢模具师招聘信息庆阳动物玻璃钢雕塑嘉兴玻璃钢雕塑批发厂家盐城商场美陈报价哪有玻璃钢广场雕塑设计浙江超市商场美陈厂家直销上海玻璃钢孔雀雕塑玻璃钢雕塑会变形吗陆丰玻璃钢十二生肖雕塑开封抽象玻璃钢人物雕塑生产厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化