MySQL join查询的原理

MySQL JOIN 与子查询深度对比:原理、性能陷阱与优化策略 本文将从原理层面解析 **MySQL JOIN 与子查询的性能差异**,结合索引、执行计划、优化器行为等核心机制,提供实战优化建议。适合数据库开发者、DBA 及希望深入理解 SQL 性能优化的读者。 阅读详情

MySQL用Nested-Loop Join算法实现join查询

区分驱动表和被驱动表,以驱动表的结果集为循环的基础,
访问被驱动表过滤数据,然后合并结果,驱动表在外循环、被驱动表在内循环。
如果还有第三张参与join查询的表,
则以合并的结果为驱动表,第三张表作为被驱动表,以此类推。

left join中的左表是驱动表、右表是被驱动表,right join刚好相反。

Nested-Loop Join有三种实现

SNLJ

Simple Nested-Loop Join

假设A是驱动表,B是被驱动表。
在这里插入图片描述
这里会扫描A表,用A的结果集作为外循环,
每循环一次,会扫描B表一遍(遍历内循环)

A表有N行,B表有M行。

SNLJ的开销如下(最大情况下):

扫描A表1次;
扫描B表N次。
总共读取记录数:N + N * M。

为了专注于理解Nested-Loop Join,这里不讨论带where子句的情况,以下相同。

BNLJ

Block Nested-Loop Join

假设A是驱动表,B是被驱动表。

用来join的字段在被驱动表没有建立索引
在这里插入图片描述
Join Buffer
MySQL会将驱动表结果集中(多条记录)用来join的字段缓存到Join Buffer,
Join Buffer的特点是只需要扫描被驱动表一次,就能得到Join Buffer中所有记录的匹配结果,
减少扫描的次数。

Join Buffer默认大小256k,会生成n-1个Join Buffer缓冲区,n为参与join查询的表数量。

A表有N行,B表有M行。

BNLJ的开销如下(最大情况下):

扫描A表1次;
扫描B表X次;
X的大小取决于N、join字段的大小、Join Buffer的大小,通常X<<N。

INLJ

Index Nested-Loop Join

假设A是驱动表,B是被驱动表。

用来join的字段在被驱动表建立了索引

聚集索引

在这里插入图片描述

非聚集索引

在这里插入图片描述
在这里我们假设您已对MySQL的索引结构有了一定的了解,
如果没有的话,可以去看下:通过B+Tree平衡多叉树理解InnoDB引擎的聚集和非聚集索引

这里会扫描A表,用A的结果集作为外循环,
然后通过B表的索引来检索,不会遍历B表。

A表有N行,B表有M行。

INLJ的开销如下(最大情况下):

扫描A表1次;
通过B表索引检索N次,成本比扫描B表N次会低很多;
回表:先找到非聚集索引,再找到聚集索引,会多一次磁盘IO。

NLJ优先级

INLJ>BNLJ>SNLJ

如何优化join查询效率

尽量将小表作为驱动表,大表作为被驱动表;
为参加join的字段在被驱动表建立聚集索引,其次是非聚集索引;
尽可能减少join的字段数量,或者使用长度比较小的字段来join,这样Join Buffer一次可以缓存更多条记录。

inner join时,MySQL会自动将小表作为驱动表,大表作为被驱动表。

扫描整张表是成本非常高的操作。

win11系统ping另一台电脑上VMware虚拟机的IP 我是用了两台电脑,所以刚才遇到一个问题就是两台电脑的IP 在同一局域网内ping不通。于是就找了很多资料,经过坚强的绝望后终于解决了。 下开始解决问题: VMWare提供了三种工作模式:bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。 1. bridged(桥接模式)   在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立主机,它可以访问网内任何一台机器。在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚 阅读详情

相关推荐

图神经网络实战(7)——图卷积网络(Graph Convolutional Network, GCN)详解与实现

图卷积网络 (Graph Convolutional Network, GCN) 架构由 Kipf 和 Welling 于 2017 年提出,其理念是创建一种适用于图的高效卷积神经网络。在本节中,我们将讨论 Vanilla GNN 架构的局限性,并详细介绍 GCN 的工作原理,通过使用 PyTorch Geometric 在 Cora 和 Facebook Page-Page 数据集上实现 GCN 来验证其性能。

盼小辉丶的博客 2万+

sql中的join(2):join执行过程,性能分析,使用join好还是单独查几个表好?

一.Join执行过程 SELECT <row_list> FROM <left_table> <inner|left|right> JOIN <right_table> ON <join condition> WHERE <where_condition> 它的执行顺序如下(SQL语句里第一个被执行的总是FROM子句): FROM:对左右两张表执行笛卡尔积,产生第一张表vt1.

Python开发分享的博客 2450

NMEA2000App-A_1.rar_PDF_

NMEA 2000 Appendix A

join语句的执行顺序

前言 通常我们写的一个完整的SQL语句都可以拆分成多个子句,子句的执行过程通常会产生虚拟表。什么是虚拟表呢?虚拟表,英文为virtual table,简称为vt。顾名思义,就是实际上并不存在,至少在物理上是不存在的,但是在逻辑上却是存在的表。在MySQL中,有三种虚拟表:临时表、内存表和视图,这里不作详细的介绍,有兴趣的话可以自行查阅资料。回到正题,一条完整的SQL语句在执行的过程中会被拆分为多个SQL子句,每个子句执行时都会产生虚拟表vt,但是最终结果只会返回最后一个虚拟表。从这个思路入手,来理解一下jo

qq_42640067的博客 6788

10张图告诉你,MySQL 是如何查找数据的?

我的新课《C2C电商系统微服务架构120天实战训练营》在公众号儒猿技术窝上线了,感兴趣的同学,可以长按扫描下方二维码了解课程详情:课程大纲请参见文末本文来自石杉架构班学员W的文章投稿在...

石杉的架构笔记 1233

MySQL 索引的实现原理

索引本质上就是一种通过减少查询需要遍历行数,加快查询性能的数据结构,避免数据库进行全表扫描,好比书的目录,让你更快的找到内容。(一个表最多16个索引) 6.1、索引的优缺点: (1)索引的优点: 减少查询需要检索的行数,加快查询速度,避免进行全表扫描,这也是创建索引的最主要的原因。 如果索引的数据结构是B+树,在使用分组和排序时,可以显著减少查询中分组和排序的时间。 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 (2)索引的缺点: 当对表中的数据进行增加、删除和修改时,索引也要进行更新,

书香水墨 824

MySQL原理

数据库MySQL原理

tz986548749的博客 4609

详解 Mysql LEFT JOINJOIN查询区别及原理

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

LoveSummer 2万+

mysql查询底层原理join的底层分析

mysql查询底层原理

杨先森的专栏 2799

mysql join查询原理_mysql join查询原理

CREATE DATABASE mysql_join_demo;CREATE TABLE users(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(100) NOT NULL DEFAULT '',pass VARCHAR(100) NOT NULL DEFAULT '',age INT NOT NULL DEFAULT 0,address VARCHAR...

weixin_29248313的博客 154

MySQL Join关联查询:从算法原理到实战优化

MySQL日常开发中,JOIN关联查询是高频操作,但相同的业务需求,不同的关联方式可能导致数倍的性能差异。其核心症结在于Join算法的选择与执行计划的优化。本文将系统拆解MySQL中5种核心关联查询算法,结合实战案例分析适用场景,并总结可落地的优化策略。

专注Java和MySQL领域知识分享 1441

mysql join left join_详解 Mysql LEFT JOINJOIN查询区别及原理

一、Join查询原理查询原理MySQL内部采用了一种叫做 nested loop join(嵌套循环连接)的算法。Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询...

weixin_42494796的博客 1553

Mysql join查询 及其原理

每次访问被驱动表,其表中的记录都会被加载到内存中,然后再从驱动表中取一条与其匹配,匹配结束后清除内存,然后再从驱动表中加载一条记录,然后把被驱动表的记录在加载到内存匹配这样周而复始,大大增加了I0的次 数。6、在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与join的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表。驱动表中的每条记录通过被驱动表的索引进行访问,因为索引查询的成本是比较固定的,故mysql优化器都倾向于使用记录数少的表作为驱动表(外表)。

m0_62616608的博客 1519

MySQLjoin buffer原理及如何提高查询效率

join buffer满或者是最后一条记录的时候,此时开始启动对于tsecer表的扫描,对于tsecer表中读取的每一个记录,结合前面缓存的每一个记录,看是否满足自己判断条件。在这个使用buffer的例子中,可以看到这个地方只是对于tsecer表进行了一次扫描,而通常来说,数据库的扫描代码是最高的(因为要涉及到磁盘读取),这样使用buffer的方式将tsecer表的扫描降低为1次,所以这个效率提高很多,特别是在涉及到的多个table,并且/或者 每个table中的记录数量都很多的情况下。

weixin_43559761的博客 1365

MySQL中 “Explain”、“索引查询优化” 以及 “JOIN 原理

用小结果集驱动大结果集,以减少 IO 次数#推荐,t1 作为驱动表,t2 作为被驱动表#不推荐,t2 作为驱动表,t1 作为被驱动表为被驱动表匹配的条件增加索引(减少内层表中循环匹配的次数)增大 JOIN BUFFER SIZE 的大小(一次缓存的越多,扫表的次数就越少)减少驱动表不必要的字段查询(字段越少,JOIN BUFFER 所缓存的数据就越多)这里需要知道的是,8.0版本的 MySQL 废弃了 BNJL ,用 Hash Join 进行替代。

📜一个热爱探索的人 1547

Mysql连接join查询原理

基本描述 MySQL的连接查询对于每一个使用MySQL数据库的开发者来说都是耳熟能详的东西,包含了内连接inner join和外连接outer join,外连接又分为左(外)链接left join 和右(外)连接right join。通过它实现将两个或者多个表中符合条件的数据进行组合返回结果集。 以两个表为例:第一个需要查询的表A表称之为“驱动表”,第二个表B表称之为“被驱动表”。 内连接即就两个表数据的笛卡尔积(两个表中无论谁作为驱动表,记录得到的笛卡尔积也一定是一样的,所以在内连接中驱动表和被驱动表是

yifan_lion的博客 1071

MySQL JOIN关联查询原理以及优化手段

MySQLjoin关联查询的执行过程以及优化手段。

终生学习践行者 2666

MysqlJoin查询使用与原理

Mysql中我们最终的一个操作就是查询查询中又要当属join的应用,这里我们在SQL的层面介绍join的7中产寻区别于数据的覆盖范围,但是不同的DB他的join使用可能略有不同。eg:Mysql中是无法使用外连接查询。这个文章中的内容都来自与B站周阳老师,记录这个笔记主要也是为了加深一下自己的认识。 一、概述与建表语句 1、概述 在Mysql中如果对join的类型不说明则默认采用的内连接——inner join。关于join这几种情况的使用通过下面的这张图以及后边的示例语句就没有什么问题了,但是他在.

任天柳 3214

mysql join 索引_mysql 从left joinjoin查询计划到联合索引的原理

left joinleft join在无脑使用中,会大表驱动小表,触发笛卡尔集,效率慢join会自动小表驱动大表参考:从一个MySQL left join优化的例子加深对查询计划的理解http://luxuryzh.iteye.com/blog/1976004相关的explain查询计划解释type分为system/const/eq_ref/ref/range/index/ALL等好几类,连接的效...

weixin_39606118的博客 226

mysql+join原理,Mysql连接join查询原理知识点

Mysql连接join查询原理知识点Mysql连接(join)查询1、基本概念将两个表的每一行,以“两两横向对接”的方式,所得到的所有行的结果。假设:表A有n1行,m1列;表B有n2行,m2列;则表A和表B“对接”之后,就会有:n1*n2行;m1+m2列。2、则他们对接(连接)之后的结果类似这样:3、连接查询基本形式:from 表1 【连接方式】 join 表2 【on连接条件】连接查询...

weixin_30937427的博客 331

Mysqljoin连接查询原理以及优化

mysql只支持一种join算法:Nested-Loop Join(嵌套循环连接),但Nested-Loop Join有三种变种:Simple Nested-Loop Join,Index Nested-Loop Join,Block Nested-Loop Join (注:参考公众号:InsideMySQL原理: 1.Simple Nested-Loop Join: 如下图,r为驱动表...

luxuenaliuxin的博客 562
上一篇: MySQL join查询的区别
下一篇: 计算机/设备和驱动器下有一个空白盘符无法删除
CaptainCats
博客等级 码龄10年 39粉丝 179原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值