当前位置: 首页 > news >正文

MySQL join的底层原理

文章目录

  • 前言
  • 一、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 通过匹配相同哈希值的行来找到满足连接条件的行。哈希连接算法适用于大型数据集和无序的连接列,但它需要额外的内存来存储哈希表

相关文章:

MySQL join的底层原理

文章目录 前言一、join是什么?二、join的使用例子三、join的连接方式1、简单嵌套2、索引嵌套3、块嵌套4、哈希连接 前言 面试的时候,被问到join 的底层原理,之前没有深入了解过,今天对这个知识点进行一个学习。 一、join是什么&…...

如何在 Spring Boot 中实现容错机制

在 Spring Boot 中实现容错机制 容错机制是构建健壮和可靠的应用程序的重要组成部分。它可以帮助应用程序在面对异常或故障时保持稳定运行。Spring Boot提供了多种机制来实现容错,包括异常处理、断路器、重试和降级等。本文将介绍如何在Spring Boot中实现这些容错机…...

Sqlite3 查询 今日、昨日、本周、上周、本月、上月、本季度、上季度、本年

一、使用Between AND select * from 表名 where 字段名 Between ‘2019-1-01 00:00:00’ AND ‘2019-7-12 23:59:59’ 二、使用>,< select * from 表名 where 字段名 > ‘2019-1-01 00:00:00’ and 字段名 < ‘2019-12-12 23:59:59’ 三、升降序 select * from 表…...

IDEA XML文件里写SQL比较大小条件

背景 最近开发的时候&#xff0c;有一个需求的查询需要支持范围查询[a,b)&#xff0c;并且查询的结果要求查询的范围含头端点不含尾端点。因为between…and…查询的范围是含头含尾的&#xff0c;因而不能使用。 因此打算直接使用>和<来比较实现&#xff0c;使用>的时…...

Camtasia Studio2024最新版本正式更新上线!

Camtasia Studio2024是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录 屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等&#xff0c;简单实用的视频录制软件,游戏的精彩画面,网络视频,屏幕录制可以让您录制屏幕所有内容视频录制支持3…...

各种业务场景调用API代理的API接口教程

API代理的API接口在各种业务场景中具有广泛的应用&#xff0c;本文将介绍哪些业务场景可以使用API代理的API接口&#xff0c;并提供详细的调用教程和代码演示&#xff0c;同时&#xff0c;我们还将讨论在不同场景下使用API代理的API接口所带来的好处。 哪些业务场景可以使用API…...

安卓App使用HttpURLConnection发送请求与上传文件

安卓原生App开发时常用的http开发工具 系统内置http请求工具为 HttpURLConnectionhttpClient 是 apache 的开源工具okHttp 使用更简单&#xff0c;语法相对HttpURLConnection也简洁了许多&#xff0c;需要在graddle添加依赖。 本文主要讲解如何使用HttpURConnection向服务器发…...

【Linux服务端搭建及使用】

连接服务器的软件&#xff1a;mobaxterm 设置root 账号 sudo apt-get install passwd #安装passwd 设置方法 sudo passwd #设置root密码 su root #切换到root账户设置共享文件夹 一、强制删除原有环境 1.删除python rpm -qa|grep pytho…...

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(三)

思维导图 1.编程思想 1.1 面向过程编程 1.2 面向对象编程 (oop) 2. 构造函数 3. 原型 3.1 原型 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IE…...

Linux 指令心法(十一)`tail` 显示文本文件的末尾部分

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 tail 是一个用于显示文本文件的末尾部分的命令。它在 Linux 和 Unix 系统中非常有用&#xff0c;因为它允许用户查看文件的最后几行&#xff0c;以便实时监视…...

Mac mov转mp4,详细转换步骤

Mac mov转mp4怎么转&#xff1f;视频文件格式为.mov是由Apple公司所开发的特殊格式。因其只能在苹果设备上播放&#xff0c;与他人分享时就会变得困难。为此&#xff0c;我们通常会选择使用MP4这种最受欢迎的视频格式。在日常使用中&#xff0c;MP4成为了大家首选的视频格式。而…...

高级深入--day31

Item Pipeline 当Item在Spider中被收集之后&#xff0c;它将会被传递到Item Pipeline&#xff0c;这些Item Pipeline组件按定义的顺序处理Item。 每个Item Pipeline都是实现了简单方法的Python类&#xff0c;比如决定此Item是丢弃而存储。以下是item pipeline的一些典型应用&…...

一文讲解图像梯度

简介&#xff1a; ​ 图像梯度计算的是图像变化的幅度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值变化也较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化较小&#xff0c;相应的梯度值变化也较小。一般情…...

湖州OLED透明拼接屏技术应用引领现代化旅游观光方式

湖州市位于中国浙江省北部&#xff0c;拥有悠久的历史和丰富的文化遗产。湖州市以其美丽的湖泊和秀丽的自然风光而闻名。 作为中国重要的历史文化名城之一&#xff0c;湖州市有着丰富的文化遗产和历史资源&#xff0c;如古城墙、古建筑和古镇等。 这为OLED透明拼接屏技术的应用…...

点云从入门到精通技术详解100篇-点云特征学习模型及其在配准中的应用(续)

目录 基于局部邻域的点云特征学习模型 3.1引言 3.2自适应邻域选择算法...

铁道交通运输运营3D模拟仿真实操提供一个沉浸、高效且环保的情境

VR模拟果蔬运输应急处理场景在农产品物流行业中具有重要的意义。这种模拟技术为农产品运输提供了全新的、更高效和更安全的方式来模拟真实世界的应急情况&#xff0c;帮助操作人员、研究者和管理者更好地理解和应对可能的运输风险措施。 VR模拟果蔬运输应急处理场景可以模拟出各…...

yum apt pip 阿里云源

centos yum 阿里云源 # 备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup# centos 6 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo curl -o /etc/yum.repos.d/CentOS-Base.repo h…...

Python+Tkinter 图形化界面基础篇:多线程和异步编程

PythonTkinter 图形化界面基础篇&#xff1a;多线程和异步编程 引言为什么需要多线程和异步编程&#xff1f;使用多线程多线程示例步骤 1 &#xff1a;导入必要的模块步骤 2 &#xff1a;创建主窗口和按钮步骤 3 &#xff1a;创建下载线程步骤 4 &#xff1a;启动主事件循环 使…...

第13章 并发编程高阶(二)

13.11 Reentrantlock和Synchronized有哪些区别 难度:★★ 重点:★★ 白话解析 继续串线,搞明白了锁的设计,那Java设计的Reentrantlock锁和JVM底层的synchronized锁到底有什么区别呢。 参考答案 1、底层实现层面 synchronized 是JVM层面的锁,是Java关键字 reentrantlock…...

Android AMS——栈管理详解(十一)

上一篇我们找到了栈管理所在的方法,这里继续对内部方法进行详细分析。 setInitialState:初始化函数。 computeLaunchingTaskFlags:检查 Activity 的启动模式。 computeSourceRootTask:处理源 Activity 的所在栈。 getReusableTask:获取能够复用的 Task。 computeTargetTas…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...