12-数据库学习笔记(五种连接算法)
一.Join连接算法的意义1.为什么我们需要连接操作因为我们通常不会把所有相关信息都塞进一张表而是把不同类型的信息分开存储当查询需要同时使用这些信息时就必须把它们“连接”起来。比如我们有一张学生表学号姓名专业1张三计算机2李四软件工程3王五网络工程还有一张成绩表学号课程成绩1数据库902数据库853数据库78当我们需要查询每个学生的姓名和数据库课程时我们就需要把Student.学号和Score.学号对应起来这就是join。那为什么我们不把所有信息都放在一张大表里这样看起来确实方便但如果一个学生有很多门课怎么办例如张三有数据库 90 操作系统 88 计算机网络 92 数据结构 95此时这张表就会变成学号姓名专业课程成绩1张三计算机数据库901张三计算机操作系统881张三计算机计算机网络921张三计算机数据结构95这样以来姓名列和专业列就会出现大量重复数据“张三”和“计算机”而且如果张三的专业发生改变就需要我们修改很多行这就容易产生数据冗余和数据不一致。所以我们就需要把数据库的信息拆开设计成Student学号姓名专业Course课程号课程名称学分Score学号课程号成绩这样每种信息只保存一次。当我们需要查询一个人的成绩时由于数据分散在多张表里这时就需要把他们连接起来。2.join的本质Join 是根据两个关系之间的关联属性把分散在不同表中的相关信息重新组合起来。整体可理解为数据分开存储→需要一起使用→通过关联字段连接→得到完整信息3.低效查询倒逼技术优化在专门的连表算法出现之前数据库要把两张表关联起来用的是最笨的办法先把两张表的所有行两两配对生成一张超级大的中间表再从里面挑出符合关联条件的数据。这个办法有个致命问题两张表的数据量会直接相乘。比如一张表 1 万行、另一张表 10 万行中间就会生出 10 亿条配对数据这里面绝大多数都是没用的。这会让磁盘读写量、计算量都爆炸式增长数据量一大就完全跑不动。所以后来学术界和工业界才陆续研究出各种高效的连表算法靠排序、哈希分桶、分块读取这些思路大幅降低了多表关联的资源消耗。4.连接算法连接算法研究的问题两个表的数据量很大时数据库如何快速找到满足连接条件的记录对。我们主要聚焦于基于相等条件的两表内连接算法即基于相等条件的两表连接。这类算法的实现逻辑稍作调整就可以支持外连接、半连接等其他类型的连接操作。在连接中通常会把较小的表作为左表外表这是数据库优化器在生成物理计划时会重点考虑的优化策略以减少内层循环的次数。二.核心逻辑与实现方法主流Join算法原理详解1.朴素嵌套循环连接嵌套循环连接是最基础的连接算法核心逻辑为双层遍历匹配通过外层遍历一张表、内层遍历另一张表可以理解为拿左表的一条记录去右表从头到尾找匹配项找完以后再拿左表下一条。我们可以用C语言中的for循环类比for(Student中的每一条记录){for(Score中的每一条记录){if(Student.idScore.sid){输出连接结果;}}}核心就是外层循环遍历外表内层循环扫描内表。但朴素嵌套循环连接效率可能很低假设学生表有1000条数据成绩表有10000条数据。在最简单情况下要进行1000*1000010000000次匹配判断如果数据量更大效率就会很低很低。所以朴素嵌套循环连接的问题就是如果外表和内表都很大需要大量重复扫描内表性能输在磁盘I/O2.分块嵌套循环连接朴素嵌套循环连接是一条一条的处理数据但是数据库有内存池所以一次性可以装很多页于是就可以一块一块的处理。本质就是把朴素版「一行扫一遍内表」的笨办法改成了「一块扫一遍内表」靠大幅减少内表的扫描次数来省磁盘 IO。优化内表扫描次数嵌套循环里最大的开销就是反复扫内表。分块之后内表的扫描次数从「外表的行数」变成了「外表的分块数」块越大扫描次数越少。用内存换 IO把外表的一批数据先缓存到内存里扫内表的时候一次性和这批数据匹配本质就是用少量内存空间换大量的磁盘读取开销。适配大外表场景如果外表太大、整个装不进内存就用分块的方式分批加载既不爆内存又比一行一行扫高效得多。3.索引嵌套循环连接核心思想索引嵌套循环连接 嵌套循环连接 内表上的索引用索引快速找到匹配记录而不是每次扫描整个内表。普通嵌套循环外表记录→扫描内表索引嵌套循环外表记录→查一个目录→直接找到内表记录这个目录就是索引这个索引通常用B树实现速度比普通嵌套循环快时间复杂度为O(logn。4.排序合并连接核心思想先把两个表按照连接键排序然后利用两个有序序列像拉拉链一样扫描匹配。嵌套循环连接张三 → 扫描Score全部李四 → 扫描Score全部王五 → 扫描Score全部如果两个表很大就会变得非常慢那有没有办法让两个表按照id排好然后直接匹配这就是排序合并连接。它主要分为两个阶段阶段1排序基于连接键通过外部分归并排序分别对表R、表S进行全局排序阶段2合并为两张有序表分别设置游标逐行比对游标所在元组的连接键键相等则拼接输出键不相等则移动较小值的游标直至遍历完任意一张表。5.哈希连接核心思想利用哈希函数把两个表中连接键相同的数据映射到同一个位置然后快速匹配。哈希连接分为两个阶段**Build建立阶段**选取小表为构建表通过哈希函数对连接键哈希在内存中构建哈希表存储元组或记录ID**Probe探测阶段**遍历大表探测表对每条元组的连接键执行相同哈希运算定位哈希表对应桶比对真实键值完成匹配。但如果表非常大不能全部放进内存这时就需要分区哈希连接。核心先分区再分别连接。6.五种算法对比算法核心思想是否需要索引适合场景复杂度Nested Loop双层循环匹配否小表O(MN)Block Nested Loop批量扫描否减少I/O较低Index Nested LoopB树查找是小表大表O(MlogN)Sort-Merge Join排序后合并否/可利用索引大表、有序数据O(NlogN)Hash Join哈希匹配否大规模等值连接O(MN)

相关新闻

适配器模式详解

适配器模式详解

目录 前言 一、缝在接口上 二、四个角色 三、对象适配器与类适配器 四、C:把两家 SDK 收成同一种帧源 4.1 Target:播放器唯一认识的类型 4.2 Adaptee:假定改不了的 SDK 4.3 对象适配器 4.4 播放器只认接口 4.5 类适配器对照…

2026/10/5 2:32:39 阅读更多 →
重温STM32基础:定时器(4)

重温STM32基础:定时器(4)

文章目录定时器选择外部时钟源配置GPIO复习AFIO !什么时候需要配置AFIO?"main function"和“alternate-default"有什么区别?full和partial remap是啥意思?实验又有问题了。。。摘要:本文记录 STM32 定时…

2026/10/5 2:32:39 阅读更多 →
HDR 图片一上屏就发灰:HarmonyOS 7 GainMap、动态范围和 SDR 回退怎么选

HDR 图片一上屏就发灰:HarmonyOS 7 GainMap、动态范围和 SDR 回退怎么选

HDR 图片一上屏就发灰:HarmonyOS 7 GainMap、动态范围和 SDR 回退怎么选 先把现象说清楚 同一张 HDR 照片在系统图库里高光正常,进入应用后却发灰;开发者把主 PixelMap 直接显示,误以为系统丢了色彩。HDR 资源可能以 Picture 承载…

2026/10/5 2:32:39 阅读更多 →

最新新闻

绝缘检测到底在测什么?电阻测量原理与兆欧表、漏电保护的应用解析

绝缘检测到底在测什么?电阻测量原理与兆欧表、漏电保护的应用解析

1. 先说结论:绝缘检测盯住的不是电压也不是电流,而是电阻干了这么多年电气设备维护,经常有人拿着绝缘检测仪问我:“师傅,这玩意到底在测啥?是测线有没有电,还是测漏不漏电?”我一开始…

2026/10/5 3:06:50 阅读更多 →
STM32链接报错L6236E?启动文件与分散加载文件排查指南

STM32链接报错L6236E?启动文件与分散加载文件排查指南

1. 先看懂L6236E在说什么:链接器找不到"第一个出场"的代码段用Keil MDK开发的朋友,十有八九都撞到过这个报错。当时我第一回见,是在一个接手项目的第二天——别人给的工程,一编译直接卡死在链接阶段,弹出一行…

2026/10/5 3:06:50 阅读更多 →
C盘爆满不用慌:三招彻底清理与无损扩容实战指南

C盘爆满不用慌:三招彻底清理与无损扩容实战指南

C盘变红的那一刻,相信每个人都经历过那种“血压升高”的瞬间。明明没装什么大软件,系统却提示磁盘空间不足,打开资源管理器一看,C盘进度条红得刺眼。这个问题在HoRain云日常运维和用户咨询里出现频率极高,也是电脑故障…

2026/10/5 3:06:50 阅读更多 →
LeetCode 20 有效的括号:用栈理解括号匹配与最近匹配

LeetCode 20 有效的括号:用栈理解括号匹配与最近匹配

如果只能选一道题来理解"栈"这种数据结构,我会选 LeetCode 第 20 题——有效的括号。这道题没有复杂的数学推导,也不需要精巧的二分优化,但它把栈的核心语义展示得淋漓尽致。作为一个刷过几百道题、也在面试现场看过别人写这道题的…

2026/10/5 3:06:50 阅读更多 →
基于OpenCV的银行卡识别系统:边缘检测、形态学与模板匹配实战

基于OpenCV的银行卡识别系统:边缘检测、形态学与模板匹配实战

简介:一套完整的基于OpenCV的银行卡识别系统源码包,面向计算机视觉学习者、金融科技开发者及高校相关课题研究。该方案融合OpenCV图像处理与机器学习技术,覆盖银行卡图像预处理、边缘检测、二值化、字符定位与识别等完整流程,可直…

2026/10/5 3:06:50 阅读更多 →
免费视频生成工具怎么选?AI生成与模板化编辑的组合工作流

免费视频生成工具怎么选?AI生成与模板化编辑的组合工作流

最近经常被问到同一个问题:市面上那么多免费视频生成工具,到底该用哪一类?我一直强调一个观点:别被“免费”两个字迷惑,先搞清楚两类工具的区别再下手。市面上的免费视频生成工具,核心就是两大方向——AI生…

2026/10/5 3:05:50 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →