MySQL join的底层原理

news2024/11/15 8:22:49

文章目录

  • 前言
  • 一、join是什么?
  • 二、join的使用例子
  • 三、join的连接方式
    • 1、简单嵌套
    • 2、索引嵌套
    • 3、块嵌套
    • 4、哈希连接


前言

面试的时候,被问到join 的底层原理,之前没有深入了解过,今天对这个知识点进行一个学习。

一、join是什么?

JOIN 是用于将多个表中的数据按照指定的条件关联起来的操作,其本质就是各个表之间数据的循环匹配

二、join的使用例子

假设有两个表:customersorders

customers 表包含以下列:

  • customer_id (主键)
  • customer_name
  • customer_email

orders 表包含以下列:

  • order_id (主键)
  • customer_id (外键,关联 customers 表中的 customer_id)
  • order_date
  • order_total

我们可以使用 JOIN 操作来查询某个客户的订单信息。以下是一个示例查询:

SELECT customers.customer_name, orders.order_id, orders.order_date, orders.order_total
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.customer_name = 'John Doe';

上述查询使用 INNER JOIN 连接 customers 表和 orders 表,连接条件是 customers.customer_id = orders.customer_id。它将返回所有满足条件(customer_name 为 ‘John Doe’)的客户的订单信息。

在这个例子中,MySQL 的 JOIN 操作会根据连接条件将 customers 表和 orders 表进行连接。它会首先找到满足连接条件的行,然后将这些行组合起来形成结果集。最终的查询结果将包含客户名、订单ID、订单日期和订单总额等信息。

三、join的连接方式

5.5 版本之前,MySQL本身只支持一种表间关联方式,就是嵌套循环(Nested Loop Join)。如果关联表的数据量很大,则join关联的执行时间会非常长。在5.5以后的版本中,MySQL通过引入BNLJ算法来优化嵌套执行。

1、简单嵌套

这是 JOIN 操作最基本的连接算法。它通过两层循环嵌套来实现连接。对于 JOIN 操作中的每一行,MySQL 在连接的另一个表中执行一个循环,找到满足连接条件的匹配行。嵌套循环连接算法简单直观,但在处理大型数据集时可能效率较低。在这里插入图片描述

2、索引嵌套

其优化的思路主要是为了 减少内层表数据的匹配次数,所以要求被驱动表上必须 有索引 才行。通过索引逐行匹配连接条件,而不是使用嵌套循环。这可以减少循环的次数,提高连接的性能。在这里插入图片描述

3、块嵌套

如果关联的是非驱动表的索引会走索引嵌套,但如果join的列不是索引,就会采用Block Nested-Loop Join
不再是逐条获取驱动表的数据,而是一块一块的获取,引入了 join buffer 缓冲区,将驱动表 join 相关的部分数据列(大小受 join buffer 的限制)缓存到 join buffer 中,然后全表扫描被驱动表,被驱动表的每一条记录一次性和 join buffer 中的所有驱动表记录进行匹配(内存中操作),将简单嵌套循环中的多次比较合并成一次,降低了被动表的访问频率。在这里插入图片描述

4、哈希连接

如果连接的列上没有适用的索引,并且数据量较大,MySQL 可以使用哈希连接算法。哈希连接算法首先将连接的两个表中的连接列进行哈希操作,然后根据哈希值将行分配到不同的哈希桶中。接下来,MySQL 通过匹配相同哈希值的行来找到满足连接条件的行。哈希连接算法适用于大型数据集和无序的连接列,但它需要额外的内存来存储哈希表

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

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

相关文章

选择功率放大器时主要看哪些指标

选择功率放大器时,有许多重要的指标需要考虑。以下是选择功率放大器时主要参考的一些指标。 输出功率:输出功率是功率放大器可以提供的最大输出功率。这是选择功率放大器时最基本的指标之一。根据应用的需求,需要确定所需的输出功率水平&…

LLM实战(一)| 使用LLM抽取关键词

抽取关键词是NLP的常见任务之一,常用的方法有TFIDF、PageRank、TextRank方法等等。在Bert时代,可以使用KeyBERT(https://github.com/MaartenGr/KeyBERT)来抽取关键词,在ChatGPT时代,KeyBERT也扩展支持了LLM…

邮件营销主题怎样撰写效果好

邮件营销主题是向订阅者提供有关公司、产品或服务的新消息和信息。邮件营销主题可以包括促销、折扣、新产品、优惠活动等。邮件营销主题可以吸引订阅者打开邮件,了解公司的新消息,从而增加公司的品牌知名度和销售额。在选择邮件营销主题时,需…

使用大模型提效程序员工作

引言 随着人工智能技术的不断发展,大模型在软件开发中的应用越来越广泛。 这些大模型,如GPT、文心一言、讯飞星火、盘古大模型等,可以帮助程序员提高工作效率,加快开发速度,并提供更好的用户体验。 本文将介绍我在实…

Spring Cloud 2023 支持同步网关,最引人注目的新特性之一

一、前言 在 Spring Cloud 2023 版本中,最引人注目的新特性之一就是支持同步网关。同步网关是一种新的网关实现,它可以保证请求的顺序性。在传统的微服务架构中,不同的服务之间通常通过 HTTP 协议进行通信,这种通信方式是非阻塞的…

【牛客面试必刷TOP101】Day7.BM31 对称的二叉树和BM32 合并二叉树

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…

Linux系统之ip命令的基本使用

Linux系统之ip命令的基本使用 一、ip命令介绍1.1 ip命令简介1.2 ip命令的由来1.3 ip命令的安装包 二、ip命令使用帮助2.1 ip命令的help帮助信息2.2 ip命令使用帮助 三、查看网络信息3.1 显示当前网络接口信息3.2 显示网络设备运行状态3.3 显示详细设备信息3.4 查看路由表3.5 查…

DHT11 数字湿温度传感器的原理和应用范例

目录 概述 1、应用电路连接说明 2、DHT11 数据结构 3、DHT11的传输时序 3.1 DHT11 开始发送数据流程 3.2 主机复位信号和 DHT11 响应信号 3.3 数字‘0’信号表示方法 3.4 数字‘1’信号表示方法 4、实例应用 4.1 硬件描述 4.2 管脚分配 4.3 程序代码 概述 DHT…

@所有燃气企业,城燃企业数字化转型重点抓住的八个关键点

关键词:智慧燃气、燃气数字化、设备设施数字化 数字化转型是用信息技术全面重塑企业经营管理模式,是企业发展模式的变革创新,是企业从工业经济时代迈向数字经济时代的必然选择。加快推进企业数字化转型,打造数字时代企业业务运行…

2023年中国超导磁体市场规模、需求量及行业竞争现状分析[图]

超导磁体一般是指用超导导线绕制的能产生强磁场的超导线圈,还包括其运行所必要的低温恒温容器。通常电磁铁是利用在导体中通过电流产生磁场,由于超导材料在超导状态下具有零电阻特性,因此可以以极小的面积通过巨大的电流。超导磁体具有场强高…

意大利航天飞行器公司【Sidereus】完成510万欧元融资

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,位于意大利萨莱诺的航天飞行器公司Sidereus Space Dynamics今日宣布已完成510万欧元融资。 本轮融资由Primo Space和CDP Venture Capital Sgr领投,通过Italia Venture II - Fondo Impr…

element picker 时间控件,指定区间和指定月份置灰

直接上代码 <el-date-pickerv-model"fillingList.declareDate"type"month":disabled"isDisplayName"placeholder"选择填报时间"value-format"yyyy-MM":picker-options"pickerOptions"change"declareDate…

玩转ChatGPT:图像识别(vol. 1)

一、写在前面 来了来了&#xff0c;终于给我的账号开放图像识别功能了&#xff0c;话不多说&#xff0c;直接开测&#xff01;&#xff01;&#xff01; 二、开始尝鲜 &#xff08;1&#xff09;咒语&#xff1a; GPT回复&#xff1a; 这幅图显示了从2005年1月到2012年12月的…

uniapp app获取keystore等一系列常用数据

https://blog.csdn.net/deepdfhy/article/details/88698492 参考文章 一、获取安卓证书keystore的SHA1和SHA256值 参数上面引用链接 window r : $ cmd $ D: 进入D盘 $ keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore 项目名称.ke…

uniapp app端使用谷歌地图选点定位

国内需要vpn 和申请谷歌地图的Maps JavaScript API 类型的 key,指引链接这里不详细介绍 一 、我们得通过webview 跳转谷歌地图 ,需要创建一个webview页面,里面跳转承载谷歌地图的html页面,如果是放在本地的话 html文件须遵守规范 放在 “项目根目录下->hybrid->html->…

Spring三级缓存流程再梳理

本文主要是说下在使用spring时遇到了循环依赖&#xff0c;Spring利用三级缓存怎么解决 getBean(beanName)doGetBean(name, null, null, false);getSingleton(beanName)方法&#xff0c; 最后会通过addSingleton(beanName, singletonObject)存到一级缓存里面去createBean(beanN…

如何进行pyhon的虚拟环境创建及管理

无论服务器或者本地&#xff0c;创建虚拟环境都是&#xff1a; 【Python】搭建虚拟环境_python创建虚拟环境_今天自洽了吗的博客-CSDN博客 虚拟环境绑定到项目 这个是运行环境&#xff0c;可以切换任意运行环境 如果是服务器上&#xff1a;可以先source xx/bin/active&#xf…

颠覆性语音识别:单词级时间戳和说话人分离 | 开源日报 No.53

vbenjs/vue-vben-admin Stars: 19.7k License: MIT Vue Vben Admin 是一个免费开源的中后台模板&#xff0c;使用最新的 vue3、vite4 和 TypeScript 等主流技术进行开发。该项目提供了现成的中后台前端解决方案&#xff0c;并可用于学习参考。 使用先进的前端技术如 Vue3/vit…

[电源选项]没有系统散热方式,没有被动散热选项

背景 笔记本的风扇声音太大&#xff0c;想改成被动散热方式&#xff0c;又不想影响性能。 于是我打开了控制面板\所有控制面板项\电源选项&#xff0c;点更改计划设置-> 更改高级电源设置。 想把散热方式改成被动散热。发现win11中好像没有这个选项了&#xff01; 如何…

JVM(一)

字节码文件的组成: 基础信息:魔数&#xff0c;字节码文件对应的java版本号&#xff0c;访问表示public final以及父类和接口 常量池:保存了字符串常量&#xff0c;类或者是接口名&#xff0c;字段名&#xff0c;主要在接口中使用 字段:当前类或者是接口声明的字段信息 方法:当…