MSQL系列(九) Mysql实战-Join算法底层原理

Mysql实战-Join算法底层原理

前面我们讲解了B+Tree的索引结构,及Mysql的存储引擎MyISAM和InnoDB,今天我们来详细讲解下Mysql的查询连接Join的算法原理

文章目录

      • Mysql实战-Join算法底层原理
        • 1.Simple Nested-Loop Join 简单嵌套循环
        • 2.Block Nested-Loop Join 块嵌套循环连接
        • 3. Index Nested-Loop Join 索引嵌套循环连接

Join算法分类
在Mysql的查询过程中,我们都知道涉及多表查询,我们都会使用join来连接多个表进行查询,join的本质就是循环每个表进行匹配,join算法可以分为三种形式

  1. 简单嵌套循环连接 SNL ( Simple Nested-Loop Join)
  2. 块嵌套循环连接 INL( Block Nested-Loop Join)
  3. 索引嵌套循环连接 INL( Index Nested-Loop Join)
1.Simple Nested-Loop Join 简单嵌套循环

Simple Nested-Loop join(NLJ)算法

  • 比较简单粗暴,就是通过双层循环比较数据来获取查询结果
  • 从循环中的第一个表中一次读取一行,将每一行传递给一个嵌套循环,判断嵌套循环中匹配数据是否一致

假如两个表,每个表都有1W条数据,那么数据对比次数就是 1w*1w=1亿次,每一次扫描其实就是从硬盘中读取数据加载到内存中,也就是一次IO,目前IO是最大的瓶颈, 查询效率相当的慢

例如 驱动表用户表User, 被驱动表class课程表

select * from User u left join  class c on u.id = c.user_id

相当于写了一个for循环来执行查询逻辑,伪代码可以看作

for(User u: User){
    for(Class c: Class){
        if(u.id == c.userId){
        //     得到匹配数据
        }
    }
}

可以用下面的图来简单的解释一下
在这里插入图片描述

2.Block Nested-Loop Join 块嵌套循环连接

我们知道上面的简单嵌套循环 效率很低是因为他必须扫描取每一条数据,者提供是非常耗时的,所以我们为啥不能多取一点呢?

Block Nested-Loop Join 块嵌套循环连接
不再是每条每条的取,而是每次都从驱动表每次取一批数据,放到内存中,然后对这一批数据进行匹配操作,当数据操作匹配完毕,就再次从驱动表中取一批数据放到内存中,再次比较,直到数据匹配完毕,完成查询,这种方式就是 块嵌套循环连接

Mysql中对这块内存有一个专门的名词就是 join buffer,我们可以通过执行

#查看join buffer大小
show variables like '%join_buffer%'

查询结果
在这里插入图片描述
那么我们的 Join Buffer有这么一个内存空间,这里面到底存储的是什么东西呢?假如我们查询2个表 a表和b表, 这里用到了

  • a表的 col1列,col2列,col3列
  • b表的 col1列 和 col2列

查询语句如下

select a.col1 from a
left join b 
on a.col2= b.col1
where a.col3 > 0 and b.col2 >0

查询过程分析

  • 首先扫描 驱动表,然后读取一定长度的数据存储到 join buffer中
  • join buffer中存储的不是驱动表的整行记录
  • join buffer中只会放驱动表参与查询的列, 也就是a表的 col1列,col2列,col3列
  • 查询的字段越少,join buffer存放的记录越多
  • 一次存放的记录越多,I/O查询的次数就越少,效率就越高
  • 对于 join buffer的大小,我们可以通过 设置去优化 设置为1M 命令 set session join_buffer_size = 1024*1024 * 1024

我们可以用下面的图来简单介绍下 块循环的逻辑
在这里插入图片描述

3. Index Nested-Loop Join 索引嵌套循环连接

上面我们讲解了 块嵌套循环连接,需要把驱动表的数据加入join buffer来进行匹配,同样非常耗时,我们有其他优化方法吗?这就引出了 Index Nested-Loop Join 索引嵌套循环连接

ndex Nested-Loop Join 索引嵌套循环连接
顾名思义就是必须有索引才行,而且是驱动表上必须有索引,通过使用索引减少扫描的次数来提高查询效率的

我们给驱动表 需要连接的列加上索引,这样匹配的过程就会非常的快

  • 首先 驱动表会根据关联字段的索引进行查询,当索引是否命中数据,直接进行回表查询该条记录
  • 驱动表会根据关联字段的索引进行查询,当索引上找到符合的值,才会进行回表查询
  • 如果非驱动表的关联字段是主键的话,查询效率非常高(主键索引结构的叶子结点包含了完整的行数据),
  • 非驱动表的关联字段如果不是主键,每次匹配到索引后都需要进行一次回表查询,性能弱于主键的查询

索引嵌套循环连接用可以用下面的图来简单描述


至此,我们彻底的了解了 join算法的底层原理,也明确直到了三种方法的优劣,有助于我们再分析索引的时候,更快的定位出问题,进行索引优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/107073.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux 内存检测工具 kfence 详解(一)

版本基于: Linux-5.10 约定: PAGE_SIZE:4K 内存架构:UMA 系列博文: linux 内存检测工具 kfence 详解(一) linux 内存检测工具 kfence 详解(二) 0. 前言 本文 kfence 之外的代码版本是基于 Linux5.10,…

ORACLE-递归查询、树操作

1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…

React 核心与实战2023版

课程亮点: 完整的前后台项目(PC+移动;完成业务;)React 最新企业标准技术栈(React 18 + Redux + ReactRouter + AntD)React + TypeScript (为大型项目奠定了基础)课程内容安排: React 介绍 React 是什么? React 是由Meta公司研发,是一个用于 构建Web和原生交互界面…

支持CT、MR三维后处理的医学PACS源码

医学影像归档与通信系统(picture archiving and communication systems,PACS)是应用于医院的数字医疗设备,如CT、MR(磁共振)、US(超声成像)、X线、DSA(数字减影&#xff…

npm更新包时This operation requires a one-time password.

[访问我的npm包](mhfwork/yt-ui - npm) 更新npm包时出现 This operation requires a one-time password.是因为需要认证 解决办法 1. 点击红线处的链接 2. 进入npm官网获取指定秘钥 3. 再次填入 one-time password 即可

word页脚设置,页脚显示第几页共有几页设置步骤

word页脚设置,页脚显示第几页共有几页设置步骤: 具体步骤: 步骤1: 步骤1.1选择页脚---空白页脚 步骤1.2,在"[在此处键入]",直接输入你需要的格式,如 “第页/共页” 步骤1.3选择第“…

定义USB接口,鼠标类和键盘类都可以作为实现类去实现USB接口

目录 程序设计 程序分析 系列文章 ​ 如图所示,我们电脑上都有USB接口,当我们的鼠标和键盘插上去之后才可以使用,拔出来就关闭使用。其实具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范…

财务数字化转型是什么?_光点科技

财务数字化转型是当今企业发展中的一项关键策略,旨在借助先进的数字技术,重新塑造和优化财务管理体系,以适应迅速变化的商业环境。这一转型不仅仅是技术的升级,更是对企业财务理念和流程的全面升级和改革。 财务数字化转型的核心在…

一文了解GC垃圾回收

一文了解GC垃圾回收 1 判断一个对象为垃圾对象的方法 引用计数法(弃用) 可达性分析算法 是否有指向GC root 的引用链,如果有,不是垃圾对象 ---->GC roo:即rt.jar包中内容 2 内存泄漏与内存溢出区别 泄漏:原本需要被回收的对象&#…

Mac版好用的Git客户端 Fork 免激活

Fork是一款强大的Git客户端软件,在Mac和Windows操作系统上都可以使用。汇集了众多先进的功能和工具,可以帮助用户更方便地管理和控制Git仓库。 Fork的界面简洁直观,易于使用。它提供了许多高级的Git功能,如分支管理、合并、提交、…

微信小程序 slot 不显示

问题:创建组件&#xff0c;使用带名字的slot&#xff0c;页面调用组件使用slot不显示 源码&#xff1a; 组件xml <view class"p-item br24" style"{{style}}"><slot name"right" wx:if"{{!custBottom}}"></slot>&l…

【咕咕送书 | 第四期】《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 ⛳️ 写在前面参与规则一、前言1.0 人工智能新技术如何创新工作 &#xff1f; 二、内容简介三、作者简介四、专家推…

Spring Boot 使用 Disruptor 做内部高性能消息队列

这里写自定义目录标题 一 、背景二 、Disruptor介绍三 、Disruptor 的核心概念3.1 Ring Buffer3.2 Sequence Disruptor3.3 Sequencer3.4 Sequence Barrier3.5 Wait Strategy3.6 Event3.7 EventProcessor3.8 EventHandler3.9 Producer 四、案例-demo五、总结 一 、背景 工作中遇…

C++in/out输入输出流[IO流]

文章目录 1. C语言的输入与输出2.C的IO流2.1流的概念2.2CIO流2.3刷题常见while(cin >> str)重载强制类型转换运算符模拟while(cin >> str) 2.4C标准IO流2.5C文件IO流1.ifstream 1. C语言的输入与输出 C语言用到最频繁的输入输出方式就是scanf ()与printf()。 scanf…

Stable Diffusion 图生图+ControlNet list index out of range

在webui1.5中用图生图ControlNet批量处理图片的时候报错&#xff1a; controlnet indexError: list index out of range 解决方法&#xff1a; 在controlNet的设置页中勾选不输出检测图即可。 参考&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui/issu…

Makefile三个版本的编写

1.Makefile Makefile是一个工程管理文件&#xff0c;简化编译的流程&#xff0c;完成自动化编译的过程 在Makefile中&#xff0c;会把编译的过程分为两步&#xff0c;先生成.o文件&#xff0c;再对.o文件链接&#xff0c;生成可执行文件 Makefile由变量、函数、和规则构成 2.引…

【APP VTable】和市面上的 Table 组件一样,都是接收表格[] 以及数据源[]

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; uni-app | 小程序开发 开发工具&#xff1a;HBuilderX 这里写目录标题 表格组件USE 表格组件 <template><view class"scroll-table-wrapper"><view class"scroll-table-container"…

2023 MathorCup(妈妈杯) 数学建模挑战赛B题完整解题思路+模型+代码

2023妈妈杯数学建模B题完整版思路、模型代码已出&#xff01;&#xff01;&#xff01; 云顶数模最新完整版解题思路、模型代码&#xff0c;供大家参考~~ B题目 解题思路 详细模型解析&#xff1a;

JavaWeb——关于servlet种mapping地址映射的一些问题

6、Servlet 6.4、Mapping问题 一个Servlet可以指定一个映射路径 <servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping>一个Servlet可以指定多个映射路径 <servlet-mapping>&…

vulnhub_DeRPnStiNK靶机渗透测试

VulnHub2018_DeRPnStiNK靶机 https://www.vulnhub.com/entry/derpnstink-1,221/ flag1(52E37291AEDF6A46D7D0BB8A6312F4F9F1AA4975C248C3F0E008CBA09D6E9166) flag2(a7d355b26bda6bf1196ccffead0b2cf2b81f0a9de5b4876b44407f1dc07e51e6) flag4(49dca65f362fee401292ed7ada96f9…
最新文章