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

news2024/9/24 13:14:01

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.coloradmin.cn/o/1134240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查找算法-二分查找法(Binary Search)

目录 查找算法-二分查找法(Binary Search) 1、说明 2、算法分析 3、C代码 查找算法-二分查找法(Binary Search) 1、说明 如果要查找的数据已经事先排好序了,就可以使用二分查找法来进行查找。二分查找法是将数据…

HackTheBox - Starting Point -- Tier 0 ---Preignition

文章目录 一 题目二 实验过程 一 题目 Tags Network、Programming、RDP、Reconnaissance、Weak Credentials译文:网络、编程、RDP、侦察、凭证薄弱Connect To attack the target machine, you must be on the same network.Connect to the Starting Point VPN us…

【面试经典150 | 链表】合并两个有序链表

文章目录 Tag题目来源题目解读解题思路方法一:递归方法二:迭代 写在最后 Tag 【递归】【迭代】【链表】 题目来源 21. 合并两个有序链表 题目解读 合并两个有序链表。 解题思路 一种朴素的想法是将两个链表中的值存入到数组中,然后对数组…

16、window11+visual studio 2022+cuda+ffmpeg进行拉流和解码(RTX3050)

基本思想:需要一个window11 下的gpu的编码和解码代码,逐开发使用,先上个图 几乎0延迟的,使用笔记本的显卡 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\extras\demo_suite>deviceQuery.exe deviceQuery.exe Starting...CUDA Device Query (Runtime API…

Xcode自定义快捷键

一、新建脚本 1. 编写脚本 把脚本sh文件保存在安全的目录,不会被删除 我这里主要是两个常用的: 1.打开终端: xcode-terminal.sh #!/bin/shif [ -n "$XcodeProjectPath" ]; then open -a Terminal "$XcodeProjectPath"/.. elseo…

macOS鼠标管理操作增强BetterMouse简体中文

BetterMouse是一款专为Mac用户设计的鼠标增强工具,旨在帮助用户更好地掌握和管理鼠标操作。它提供了全局鼠标手势、高度可定制的鼠标设置选项以及一些有用的鼠标增强功能,如鼠标放大镜、鼠标轨迹和应用程序切换功能。这些功能可以大大提高用户的工作效率…

Redis桌面管理工具:Redis Desktop Manager for Mac

Redis Desktop Manager是一款非常实用的Redis管理工具,它不仅提供了方便易用的图形用户界面,还支持多种Redis数据结构,可以帮助用户轻松地完成Redis数据库的管理工作。 以下是一些推荐Redis Desktop Manager的理由: 多平台支持&a…

2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning

2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning Paper: https://arxiv.org/abs/2104.08691 Code: https://github.com/google-research/ text-to-text-transfer-transformer/ blob/main/released_checkpoints.md# lm-adapted-t511lm100k 在这项工作中&…

如何编辑pdf?推荐福昕高级pdf编辑器

这里写目录标题 安装教程1.双击FoxitPhantomPDF941_L10N_Setup.exe安装2.打开FiX UZ1文件夹 复制plugins文件夹和FoxitPhantomPDF.exe到安装目录中替换3. 双击Express2BusinessFix New.reg导入注册表 如何复制页面如何修改pdf的内容福昕高级pdf编辑器安装包 【Note】学校要求加…

http代理IP它有哪些应用场景?如何提升访问速度?

随着互联网的快速发展,越来越多的人开始关注网络速度和安全性。其中,代理IP技术作为一种有效的网络加速和安全解决方案,越来越受到人们的关注。那么,http代理IP有哪些应用场景?又如何提升访问速度呢? 一、h…

TeeChart for .NET 2023.10.19 Crack

TeeChart.NET 的 TeeChart 图表控件提供了一个出色的通用组件套件,可满足无数的图表需求,也针对重要的垂直领域,例如金融、科学和统计领域。 数据可视化 数十种完全可定制的交互式图表类型、地图和仪表指示器,以及完整的功能集&am…

DevOps持续集成-Jenkins(1)

文章目录 DevOpsDevOps概述Code阶段工具(centos7-gitlab主机)Windows下安装Git(作用是:使我们可以上传代码到GitLab)Linux下安装GitLab⭐(作用是:运行一个GitLab接收代码)环境准备先…

电脑QQ如何录制视频文件?

听说QQ可以录制视频,还很方便,请问该如何录制呢?是需要先打开QQ才可以录制吗?还是可以直接使用快捷键进行录制呢?录制的质量又如何呢? 不要着急,既然都打开这篇文章看了,那小编今天…

使用Docker快速搭建服务器环境

简介 这篇文章也是方便自己记录搭建流程,服务器的购买啥的就不说了,最终目标就是在一个空白的Linux系统上,使用docker运行MySQL、TomcatJava、Nginx、Redis 的单机环境,以后方便自己快速的部署服务器。 安装Docker 首先需要安装…

宏电5G RedCap工业智能网关获首个中国移动5G物联网开放实验室5G及轻量化产品能力认证

10月21日,2023世界物联网博览会——中国移动物联网开发者大会暨物联网产业论坛在无锡圆满举行。宏电股份参与中国移动5G物联网开放实验室5G及轻量化产品能力认证成果授牌仪式,并获得认证证书。 此次认证主要对产品功能、产品性能、RedCap网络兼容性进行测…

为什么POST请求经常发送两次?

大多数初级前端程序员,在通过浏览器F12的调试工具调试网络请求时,可能都会有一个发现,在进行POST请求时,明明代码里只请求了一次,为什么network里发送了两次呢,难道我代码出bug了?带着疑问点开第…

根据递归原理设计一个简单的代码生成器

数据结构设计 可以设计一个组件节点ComponentNode的数据结构,包含name、props、children字段,其中children再嵌套子组件节点。 class ComponentNode {constructor(name, props) {this.name namethis.props propsthis.children [] } }递归算法设计 function generateCode(…

【Java笔试强训】Day5(45842-统计回文、58539-连续最大和)

45842-统计回文 链接:45842-统计回文 题目: “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在…

多测师肖sir_高级金牌讲师__接口测试之tonken (5.6)

接口测试之tonken 网站:http://shop.duoceshi.com/login?redirect2Fdashboard 第一个接口:uiid接口 uiid接口url:http://manage.duoceshi.com/auth/code test中语句: var jsonData JSON.parse(responseBody); postman.setEnvi…

javaEE -9(7000字详解TCP/IP协议)

一: IP 地址 IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物…