千家信息网

Nested Loop的Join有哪些用法

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"Nested Loop的Join有哪些用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Nested Loop的Join有哪些用法
千家信息网最后更新 2026年11月02日Nested Loop的Join有哪些用法

这篇文章主要讲解了"Nested Loop的Join有哪些用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Nested Loop的Join有哪些用法"吧!

我们都知道SQL的join关联表的使用方式,但是这次聊的是实现join的算法,join有三种算法,分别是Nested Loop Join,Hash join,Sort Merge Join。

MySQL官方文档中提到,MySQL只支持Nested Loop Join这一种join algorithm

MySQL resolves all joins using a nested-loop join method. This means that MySQL reads a row from the first table, and then finds a matching row in the second table, the third table, and so on. explain-output

所以本篇只聊Nested Loop Join。

NLJ是通过两层循环,用第一张表做Outter Loop,第二张表做Inner Loop,Outter Loop的每一条记录跟Inner Loop的记录作比较,符合条件的就输出。而NLJ又有3种细分的算法:

1、Simple Nested Loop Join(SNLJ)

    // 伪代码    for (r in R) {        for (s in S) {            if (r satisfy condition s) {                output ;            }        }    }

SNLJ就是两层循环全量扫描连接的两张表,得到符合条件的两条记录则输出,这也就是让两张表做笛卡尔积,比较次数是R * S,是比较暴力的算法,会比较耗时。

2、Index Nested Loop Join(INLJ)

    // 伪代码    for (r in R) {        for (si in SIndex) {            if (r satisfy condition si) {                output ;            }        }    }

INLJ是在SNLJ的基础上做了优化,通过连接条件确定可用的索引,在Inner Loop中扫描索引而不去扫描数据本身,从而提高Inner Loop的效率。 而INLJ也有缺点,就是如果扫描的索引是非聚簇索引,并且需要访问非索引的数据,会产生一个回表读取数据的操作,这就多了一次随机的I/O操作。

3、Block Nested Loop Join(BNLJ)

一般情况下,MySQL优化器在索引可用的情况下,会优先选择使用INLJ算法,但是在无索引可用,或者判断full scan可能比使用索引更快的情况下,还是不会选择使用过于粗暴的SNLJ算法。 这里就出现了BNLJ算法了,BNLJ在SNLJ的基础上使用了join buffer,会提前读取Inner Loop所需要的记录到buffer中,以提高Inner Loop的效率。

    // 伪代码    for (r in R) {        for (sbu in SBuffer) {            if (r satisfy condition sbu) {                output ;            }        }    }

MySQL中控制join buffer大小的参数名是join_buffer_size。

We only store the used columns in the join buffer, not the whole rows.
join-buffer-size

根据MySQL手册中的说法,join_buffer_size缓冲的是被使用到的列。

算法比较(外表大小R,内表大小S):

\algorithm

comparison\

Simple Nested Loop JoinIndex Nested Loop JoinBlock Nested Loop Join
外表扫描次数111
内表扫描次数R0
比较次数R * SR * IndexHeightR * S
回表次数0RS_Matches0

在MySQL5.6中,对INLJ的回表操作进行了优化,增加了Batched Key Access Join(批量索引访问的表关联方式,这样翻译可以不。。。)和Multi Range Read(mrr,多范围读取)特性,在join操作中缓存所需要的数据的rowid,再批量去获取其数据,把I/O从多次零散的操作优化为更少次数批量的操作,提高效率。

感谢各位的阅读,以上就是"Nested Loop的Join有哪些用法"的内容了,经过本文的学习后,相信大家对Nested Loop的Join有哪些用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

索引 算法 次数 数据 情况 代码 大小 就是 效率 条件 学习 内容 基础 外表 方式 是在 关联 循环 输出 选择 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技靠谱吗 山东特亿宝互联网科技有限公司 科技与互联网 涨乐互联网科技 猪兼强互联网科技 万易互联网科技有限公司 碳银互联网科技有限公司 上海万想互联网科技 开启互联网科技时代小说 创业天下互联网科技有限公司 中化能源互联网科技招聘 宝灵互联网科技有限公司 中国航天科技大学国际工业互联网 健康食品互联网创新科技园项目 东营紫格互联网科技 广州燕处互联网科技有限公司 万物互联网智能科技 陕西九四连强互联网科技有限公司 西安左小互联网科技有限公司 科技美学互联网 艺术 互联网科技公司经营范围 顺网科技2021年互联网排名 海南科技产业互联网平台 天速互联网络科技有限公司 科技互联网大厂 厦门千工互联网科技有限公司 996高科技互联网公司 工业互联网展湾科技股份有限公司 中国科技和美国互联网 北京瑞云互联网科技有限公司
0