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

Mysql JOIN 的物理执行流程

一、关联字段在两个表中都没有索引当两个参与join的表在关联字段上都没有索引时MySQL 无法使用高效的索引树搜索而是被迫采用Block Nested-Loop Join (BNL)算法。为了清晰讲解物理流程我们设定如下 SQL 示例 表t1t1t1驱动表100 行数据字段bbb无索引 。表t2t2t2被驱动表1000 行数据字段bbb无索引 。SQL 语句select * from t1 straight_join t2 on (t1.bt2.b);1. 物理执行流程详解在物理层面该操作不再是“点对点”的查找而是一次大规模的“内存对撞”过程 扫描并装载驱动表MySQL 首先全表扫描驱动表t1t1t1将这 100 行数据全部读入线程内存join_buffer中 。注意由于是select *整行数据都会被存入内存 。顺序扫描被驱动表随后MySQL 开始全表扫描被驱动表t2t2t2。它每从磁盘读入t2t2t2的一行数据并不会立即写回结果集 。内存高速比对对于t2t2t2读入内存的每一行MySQL 都会将其与join_buffer中缓存的 100 行t1t1t1数据逐一进行等值判断 。如果匹配成功则作为结果集的一行返回。循环直至结束重复上述过程直到t2t2t2的 1000 行数据全部扫描并比对完毕。2. 核心物理指标在这个示例中虽然 SQL 看似简单但底层的物理开销非常巨大 磁盘扫描行数10010001100100 1000 110010010001100行 。驱动表t1t1t1扫一遍被驱动表t2t2t2扫一遍。内存判断次数100×100010100 \times 1000 \mathbf{10}100×100010万次。这是最消耗 CPU 资源的地方。因为没有索引辅助每一行都必须和内存中所有的行“对撞”一次。3. 极端情况如果join_buffer不够大怎么办如果驱动表t1t1t1很大例如 10 万行而join_buffer只能放得下 1 万行物理流程会演变为分段处理Block从t1t1t1取出前 1 万行放入join_buffer。扫描t2t2t2全表100 万行在内存中进行1万×100万1\text{万} \times 100\text{万}1万×100万次比对 。清空join_buffer。从t1t1t1取出接下来的 1 万行再次全表扫描t2t2t2进行比对 。物理后果此时被驱动表t2t2t2会被重复扫描多次。如果t1t1t1被分成KKK段总扫描行数将变成NK×MN K \times MNK×M。这会产生剧烈的磁盘 IO 波动并严重污染 Buffer Pool导致整个数据库实例响应变慢。二、关联字段在其中一个表中有索引当join关联字段在两个表中呈现“一有一无”的索引状态时MySQL 的物理执行过程取决于优化器对驱动表Driver Table的选择。核心结论是MySQL 优化器会为了利用索引而极力避免BNL 算法通常会选择将带索引的表作为被驱动表。1. 物理流程的两种可能性假设表t1t1t1无索引100 行表t2t2t2有索引1000 行。情况一带索引的表t2t2t2作为“被驱动表”这是最优选此时物理上执行的是Index Nested-Loop Join (NLJ)算法 扫描驱动表全表扫描不带索引的t1t1t1100 行。点对点查找每读出t1t1t1的一行就拿着关联字段的值去t2t2t2的索引树上搜索。物理开销扫描行数100100100 100100100假设 1:1 匹配。计算复杂度100×log⁡21000100 \times \log_2 1000100×log2​1000。结果这是最快的方式因为利用了索引的对数级搜索能力。情况二不带索引的表t1t1t1作为“被驱动表”这是最差选如果因为某些极端原因如t2t2t2过滤后的结果集极小优化器选了t1t1t1倒过来驱动则物理上执行的是Block Nested-Loop Join (BNL)算法 扫描驱动表扫描带索引的t2t2t2将数据放入join_buffer。暴力对撞由于被驱动表t1t1t1没有索引系统必须对t1t1t1执行全表扫描。内存比对将t1t1t1的每一行与内存中的数据进行暴力比对。物理开销内存判断次数1000×100101000 \times 100 \mathbf{10}1000×10010万次。结果性能极差且会大量消耗 CPU 资源 。2. 优化器的“智取”索引权重高于表大小在之前的讲解中我们提到过“小表驱动大表”的原则 。但在“一有一无”的情况下是否有索引对算法效率的影响NLJ vs BNL通常远超表的大小。具体示例表AAA100 行没有索引。表BBB100 万行有索引。虽然表AAA很小但如果选AAA驱动BBB可以走索引NLJ如果选BBB驱动AAA则必须走暴力内存比对BNL。A 驱动 B (NLJ)扫描 100 行 100 次索引树搜索→\rightarrow→毫秒级完成。B 驱动 A (BNL)扫描 100 万行 1 亿次内存比对→\rightarrow→秒级甚至分钟级。因此物理交互的真相是优化器会优先选择那个不带索引的表作为驱动表从而强行让那个带索引的表成为被驱动表以触发 NLJ 或 BKA 算法来提升性能 。三、BKA优化NLJ算法BKABatched Key Access算法是 MySQL 对 Index Nested-Loop JoinNLJ的进一步优化。它的核心逻辑是利用join_buffer批量缓存驱动表的数据并配合MRRMulti-Range Read技术将原本随机的磁盘访问转化为顺序访问。以下是关于 BKA 算法的详细拆解1. 适用场景BKA 算法主要适用于以下场景使用了索引关联即被驱动表的关联字段上有索引这是 NLJ 算法的前提。磁盘 IO 瓶颈当被驱动表数据量较大且无法全部加载进内存时随机回表的代价很高此时 BKA 的提速效果最显著。配置开启由于 BKA 依赖于 MRR而 MRR 的开启策略通常较为保守因此需要手动设置参数以确保 BKA 能够生效setoptimizer_switchmrron,mrr_cost_basedoff,batched_key_accesson;2. 物理执行流程传统的 NLJ 算法是“拿一行驱动表数据去被驱动表查一次索引”。而 BKA 算法改成了“批量处理”批量读入驱动表从驱动表t1中读取满足条件的行并存入join_buffer内存中。构造批量键值当join_buffer存满或者数据读完后将这批记录的关联字段Key一次性发送给被驱动表t2的引擎层。触发 MRR 排序被驱动表t2接收到这批 Key 后利用 MRR 机制进行如下物理操作在普通索引树上找到所有匹配记录的主键 ID。将这些 ID 放入read_rnd_buffer中进行递增排序。按照排序后的主键顺序顺序访问主键索引聚簇索引拉取整行数据。返回结果将取出的t2数据与join_buffer中的t1原始数据进行匹配返回给 Server 层。3. 算法开销分析BKA 虽然极大地提升了查询速度但也带来了一定的资源开销内存开销join_buffer用于缓存驱动表的数据其大小由join_buffer_size决定 。read_rnd_buffer用于 MRR 阶段的主键 ID 排序大小由read_rnd_buffer_size决定。CPU 开销在 MRR 阶段系统需要对主键 ID 序列进行排序操作。如果一次性处理的 ID 数量极其庞大会产生一定的 CPU 计算负担。IO 模式改变正向开销扫描行数不变物理上扫描的行数与传统的 NLJ 并没有区别 。性能提升根源开销的减少主要源于减少了磁头寻道时间。将随机的磁盘跳转改成了连续的块读取这在机械硬盘上是量级的提升在 SSD 上也能减少内部控制器的随机寻址压力。四、HashJoin优化BNL算法由于 MySQL 5.6 和 5.7 版本在内核中并未内置原生的 Hash Join 执行引擎文档主要通过“应用层 Hash Join”来展示其逻辑以解决被驱动表无索引时 Block Nested-Loop Join (BNL) 算法性能低下的问题。Hash Join 的核心物理逻辑是将原本需要“暴力比对”的N×MN \times MN×M次判断通过在内存中构建哈希表降级为近似O(1)O(1)O(1)的定位操作。1. 适用场景无索引关联Join 关联字段在两张表中都没有索引导致无法使用 NLJ 或 BKA 算法。等值连接仅适用于等值 Join如t1.b t2.b因为哈希表无法处理范围查询如或。内存充足内存或应用端内存必须能够容纳较小表Build Table过滤后的全部数据集。2. 物理执行流程以select * from t1 join t2 on t1.b t2.b为例假设t1t1t1为 1000 行t2t2t2为 100 万行。1. 构建阶段 (Build Phase)扫描小表全表扫描驱动表t1t1t1。内存建模在内存中创建一个哈希表Hash Table。哈希计算将t1t1t1的每一行根据关联字段bbb的值计算哈希值然后以bbb为 Key整行数据为 Value 存入哈希表。2. 探测阶段 (Probe Phase)扫描大表全表扫描被驱动表t2t2t2。命中检索对于t2t2t2读入内存的每一行取其字段bbb的值进行同样的哈希计算。定位匹配直接去哈希表中检索对应的 Key。匹配成功直接取出t1t1t1的数据进行拼装返回结果。匹配失败继续处理t2t2t2的下一行。3. 算法开销分析1. 扫描行数 (IO 开销)磁盘扫描NMN MNM。优势每个表都只做一次物理全表扫描彻底规避了 BNL 算法中被驱动表可能被重复扫描多次的问题 。2. CPU 计算开销复杂度由 BNL 的O(N×M)O(N \times M)O(N×M)暴力比对降级为O(NM)O(N M)O(NM)。物理意义内存中进行的不再是数亿次的字符串或数值比较而是极快且次数极少的哈希计算与指针定位。3. 内存开销空间占用必须在内存中开辟足以存储整个驱动表Build表结果集的空间。风险如果结果集超过内存上限会导致严重的内存溢出OOM或必须借用磁盘临时文件进行分块处理Graceful Hash Join这会引入额外的磁盘 IO 损耗 。4. 具体示例对比背景t1t1t11000行t2t2t2100万行字段bbb均无索引。指标Block Nested-Loop (BNL)Hash Join (应用层)物理逻辑扫描t2t2t2时每一行都要跟内存里的 1000 行t1比对扫描t2t2t2时每一行只算一次哈希直接定位t1t1t1内存判断次数10 亿次(1000×100万1000 \times 100万1000×100万)100 万次哈希查找执行耗时约71.95 秒 1 秒总结Hash Join 的物理精髓是“空间换时间”。它通过在内存中提前构建高效的索引结构哈希表消除了 Join 过程中最昂贵的笛卡尔积式暴力比对。

相关文章:

Mysql JOIN 的物理执行流程

一、关联字段在两个表中都没有索引 当两个参与 join 的表在关联字段上都没有索引时,MySQL 无法使用高效的索引树搜索,而是被迫采用 Block Nested-Loop Join (BNL) 算法。 为了清晰讲解物理流程,我们设定如下 SQL 示例 : 表 t1t1t1…...

Hermes Agent用户如何快速接入Taotoken的多模型服务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Hermes Agent用户如何快速接入Taotoken的多模型服务 基础教程类,面向使用Hermes Agent的开发者,详细说明在…...

9.2%年复合增长!2032年全球电子束曝光系统市场冲刺36.13亿美元

电子束曝光系统(EBL)是一种依托电子束照射光敏材料实现微细图案加工的高精度设备,核心原理是在真空环境中将电子束精准聚焦于待加工表面,刻写纳米级精细图案,凭借极高的分辨率与操作灵活性,广泛应用于半导体…...

2026届必备的六大AI写作神器推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 目前学术环境情形下,对于知网文献里生成性AI创作遗留痕迹的合规优化事宜&#xf…...

乙烯基甲苯市场深度洞察:年复合增长率(CAGR)为5.7%(2026-2032)

乙烯基甲苯(VT)是乙烯基甲苯单体(间位与对位混合物),分子式C9H10,是一种低挥发、低毒性的环保型单体,可作为苯乙烯的替代物,用于制备不饱和树脂、涂料、绝缘漆及特种橡胶等。QYResea…...

MySQL 8.0隐藏特性实战:隐藏列、隐藏索引与生成主键的应用与避坑

1. 项目概述:深入挖掘MySQL 8.0的“隐身术”干了这么多年数据库运维和开发,我见过太多因为表结构变更而引发的线上事故。开发同学在代码里写个SELECT *,当时是省事了,等到哪天要加个字段,特别是往中间插一列&#xff0…...

LeetCode 单词搜索II题解

LeetCode 单词搜索II题解 题目描述 给定一个二维字符网格和一个字符串数组,找出所有在网格中出现的单词。 示例: 输入:board [["o","a","a","n"],["e","t","a",&quo…...

告别ST-LINK Utility:一文详解STM32CubeProgrammer在Win10下的新特性与高效用法

STM32CubeProgrammer全面指南:解锁Win10下高效开发的六大核心能力 在嵌入式开发领域,工具链的每一次迭代都意味着效率的跃升。当STMicroelectronics宣布STM32CubeProgrammer正式取代经典的ST-LINK Utility时,许多开发者还在犹豫是否要迁移到这…...

微信网页版访问技术方案:wechat-need-web扩展的智能实现

微信网页版访问技术方案:wechat-need-web扩展的智能实现 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 在当今数字化办公环境中&#xff…...

研一新生必看!文献管理软件到底要不要用?Scholaread vs Zotero新手友好度对比

刚进入研究生阶段,你可能会听到师兄师姐反复强调"一定要用文献管理软件",但心里却充满疑问:我就几十篇文献,真的需要专门的工具吗?市面上那么多软件,Zotero、EndNote、Scholaread…到底哪个适合零基础的我? **研一新生面临的最大困境:**电脑里200篇PDF文件散落在下…...

别再装Hash工具了!用7-Zip v21.07一键校验下载文件,保姆级图文教程

7-Zip隐藏技能:用右键菜单3秒完成文件校验的终极指南 当你从网上下载了一个重要文件,如何确认它没有被篡改或损坏?大多数人的第一反应是寻找专门的哈希校验工具,但你可能不知道,电脑里早已安装的7-Zip就能完美解决这个…...

瑞德克斯平台:全球金融市场的可靠选择

瑞德克斯平台:全球金融市场的可靠选择在评估金融服务平台时,监管合规、技术能力、客户服务等维度构成了重要的观察方向。瑞德克斯平台作为业内较为活跃的服务机构,其在这些方面的实践具有一定的参考价值。本文将围绕评测视角,对其…...

终极指南:如何用Tinke轻松提取和修改任天堂NDS游戏资源

终极指南:如何用Tinke轻松提取和修改任天堂NDS游戏资源 【免费下载链接】tinke Viewer and editor for files of NDS games 项目地址: https://gitcode.com/gh_mirrors/ti/tinke 还在为无法访问NDS游戏内部资源而烦恼吗?Tinke是一款免费开源的NDS…...

性能测试工程师的春天来了?深度解析2026年就业趋势

一、冰火两重天:测试就业市场的结构性裂变 2026年的技术招聘市场,回暖与寒意并存。脉脉高聘人才智库报告显示,春招新经济行业新发岗位量同比增长22.6%,AI领域岗位量更是暴涨8.7倍。然而,这轮红利并非雨露均沾。传统功…...

国央企备考求职精灵和粉笔APP哪个靠谱

每年国央企和事业单位招聘季,数百万求职者竞争激烈。面对庞大的招录名额、繁琐的笔试流程,选择合适的备考工具至关重要。市场上,粉笔是公考领域的老牌选手,而求职精灵 Genielink 作为 AI 原生工具也在改变着求职赛道格局。下面就对…...

如何快速部署微信网页版浏览器扩展:终极完整指南

如何快速部署微信网页版浏览器扩展:终极完整指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法在浏览器中直接使用微信而烦恼…...

乔治亚理工等联手:让AI大模型“自学成才“,不再依赖更强大的老师

这项由佐治亚理工学院、加州大学洛杉矶分校、卡内基梅隆大学以及威廉与玛丽学院联合开展的研究,以预印本形式发布于2026年5月,论文编号为arXiv:2605.06597。感兴趣的读者可通过该编号在arXiv平台查阅完整论文。 一、问题从哪里来:大模型的&qu…...

终极指南:如何让Photoshop支持AVIF格式并实现图像体积减半

终极指南:如何让Photoshop支持AVIF格式并实现图像体积减半 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 想让你的Photoshop支持最新的AVIF图像格式…...

谷歌与新加坡国立大学联手打造“视频导演AI“

这项由谷歌云AI研究院与新加坡国立大学联合完成的研究,于2026年5月以预印本形式公开发布,论文编号为arXiv:2605.06924v1。有兴趣深入阅读原文的读者可通过该编号在arXiv平台检索到完整论文。**研究背景:AI拍视频为何总是"记性不好"…...

LangChain 第一课:核心架构与组件(前端友好版)

一、先一句话搞懂:LangChain 到底是什么?LangChain 是一个大模型应用开发框架,专门帮你把「大模型、RAG、Agent、工具调用」这些功能,像搭积木一样快速拼起来,不用从零写复杂逻辑。前端类比秒懂你写 Vue 要用到 Vue、V…...

银行AI大模型应用火爆!小白也能学会的数智转型秘籍,速收藏!

文章阐述了银行业在金融行业AI转型中的领先地位,AI大模型已从试点探索进入规模化落地阶段。银行采用自研与合作模式发展大模型,应用场景覆盖智能客服、信贷风控、运营自动化、财富管理及合规审计等核心业务。文章通过多个银行案例展示了AI大模型在降本增…...

ES数据库安装

ES数据库安装 # 拉取 Elasticsearch 镜像 docker pull public-docker-virtual.artsz.zte.com.cn/elasticsearch:8.8.2创建宿主机挂载目录# 统一放在 /data/es,便于管理mkdir -p /mnt/data/es/{data,config,logs,plugins}# 权限必须给足(否则容器内用户无…...

如何在Windows上使用iperf3进行专业级网络性能测试:完整指南

如何在Windows上使用iperf3进行专业级网络性能测试:完整指南 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds iperf3作为专业的网络性能基…...

3步解锁WeMod Pro:Wand-Enhancer免费增强工具完全指南

3步解锁WeMod Pro:Wand-Enhancer免费增强工具完全指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 阅读预期:你能从本文获得什…...

互联网大厂 Java 求职面试:微服务与云原生

互联网大厂 Java 求职面试:微服务与云原生 在某互联网大厂的面试中,面试官与求职者燕双非展开了一场关于微服务与云原生的深入对话。以下是他们的问答记录。第一轮提问 面试官:燕双非,首先请你简单介绍一下你对微服务架构的理解。…...

SAST 静态代码分析平台命令行接口介绍(终结篇)

下面软件工厂生成的报告展示,可以根据客户需要定制。特别说明,下面图中的所有数据均是虚构数据,仅仅是为了做图展示。1、扫描覆盖与项目分布2、漏洞总览和项目红黑榜3、按语言统计和项目修复趋势4、合规性分析5、人员缺陷统计和型号版本质量趋…...

对抗AI焦虑的最好方式是搞懂大模型的底层原理

文章指出,尽管AI技术如RAG、MCP、Skill、Agent、Harness等迭代迅速,但程序员应专注于掌握大模型的底层原理,如记忆、信息获取、操作能力等,这些原理不会因技术变迁而失效。通过理解这些基础认知,程序员能更好地应对技术…...

保姆级教程:在GD32F103上配置USART1的DMA通道5和6(附避坑指南)

GD32F103 USART1 DMA配置全攻略:从手册解读到实战避坑 在嵌入式开发中,USART与DMA的配合使用是提升串口通信效率的黄金组合。对于刚从STM32转向GD32F103的开发者来说,手册中DMA通道映射关系的不明确常常成为第一个"拦路虎"。本文将…...

Design - 一些免费图标网站

一些有用的工具网站;除了直接AI生成外,仍然有些有用的Icon免费网站,比较适合游戏的有:1. icons8.com最适合综合型游戏项目图标、插画、UI 资源比较全风格统一,适合游戏界面、按钮、功能图标可在线调整颜色和尺寸&#…...

为什么这个电路可以放大1V信号?

你的经验可能是你的枷锁这个三级直接耦合放大电路对于1kHz峰值1V信号的放大三极直接耦合放大电路参数优化被AI欺骗啦:一个有趣的三极直接耦合放大电路的调整一个三极直接耦合放大电路的设计 01 为何能够放大1V信号? 一、电路配置结果 今天很高兴&#xf…...