MySQL查询优化之五-嵌套循环连接算法(Nested-Loop Join Algorithms)


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

环境:
MySQL版本:5.5.15
操作系统:windows

本文讨论嵌套循环连接算法(Nested-Loop Join Algorithms)。

MySQL使用嵌套循环算法或其变种来进行表之间的连接。

这里主要介绍两种算法:
嵌套循环连接算法(Nested-Loop Join Algorithm)和块嵌套循环连接算法(Block Nested-Loop Join Algorithm)

1.嵌套循环连接算法(Nested-Loop Join Algorithm)

一个简单的嵌套循环连接(NLJ)算法从循环中的第一个表中逐行读取一行,将每行传递给处理连接中下一个表的嵌套循环。 这个过程会重复多次,因为还有剩余的表被连接。

假定要使用以下连接类型执行三个表t1,t2和t3之间的连接:

Table   Join Type
t1      range
t2      ref
t3      ALL

如果使用一个简单的NLJ算法,连接就像这样处理:

for each row in t1 matching range {for each row in t2 matching reference key {for each row in t3 {if row satisfies join conditions, send to client}}
}

由于NLJ算法从外循环向内循环一次传递一行,因此它通常会多次读取在内循环中处理的表。

2.块嵌套循环连接算法(Block Nested-Loop Join Algorithm)

块嵌套循环(BNL)连接算法使用在外部循环中读取的行的缓冲来减少必须读取内部循环中的表的次数。 例如,如果将10行读入缓冲区并将缓冲区传递给下一个内部循环,则可以将内部循环中读取的每一行与缓冲区中的所有10行进行比较。 这将内部表格的读取次数减少一个数量级。

MySQL连接缓冲具有以下特点:

  • 当连接的类型为ALL或者index(换句话说,当没有可能的键可以被使用,并且数据行或者索引行分别被完全扫描时)或者range时,可以使用连接缓冲。
  • 一个连接缓冲区永远不会分配给第一个非常量表,即使它是ALL或index。
  • 只有特定的列存储在其连接缓冲区中,而不是整行。
  • join_buffer_size系统变量确定用于处理查询的每个连接缓冲区的大小。
  • 为每个可以缓冲的连接分配一个缓冲区,因此可以使用多个连接缓冲区来处理给定的查询。
  • 连接缓冲区在执行连接之前被分配并在查询完成后被释放。

对于前面介绍的NLJ算法(无缓冲)的示例连接,使用连接缓冲按如下方式完成连接:

for each row in t1 matching range {for each row in t2 matching reference key {store used columns from t1, t2 in join bufferif buffer is full {for each row in t3 {for each t1, t2 combination in join buffer {if row satisfies join conditions, send to client}}empty join buffer}}
}if buffer is not empty {for each row in t3 {for each t1, t2 combination in join buffer {if row satisfies join conditions, send to client}}
}

如果S是每个存储的t1的大小,则t2组合是连接缓冲区,C是缓冲区中的组合的数量,表格t3被扫描的次数是:

(S * C)/join_buffer_size + 1

随着join_buffer_size的值增加,t3扫描的数量减少,直到join_buffer_size足够大以容纳所有先前的行组合。 在这一点上,没有速度通过使其更大。


Reference:
https://dev.mysql.com/doc/refman/5.5/en/nested-loop-joins.html


觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!

如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

MySQL查询优化之五-嵌套循环连接算法(Nested-Loop Join Algorithms)相关推荐

  1. Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join

    关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理. 表的三种关联方式: nested loop:从A表抽一条记录,遍历B表查找匹配 ...

  2. Nested Loop Join入门

    Nested Loop Join 之间的表关联是使用索引进行匹配的,假设表 R 和 S 进行连接,其算法伪代码大致如下: for each row r in R with matching condi ...

  3. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  4. 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN

    表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...

  5. 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN【转】

    表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...

  6. mysql join 循环_关于mysql联表的内嵌循环操作nested loop join中on和where执行顺序问题...

    mysql的理论依据没找到,个人理解是先执行where的过滤条件,先关联再过滤明显做的是无用功. oracle中倒是能在执行计划中看到,先执行的是过滤条件(下面代码中最后一行). explain pl ...

  7. 并行循环和嵌套循环_并行嵌套循环连接–嵌套循环连接和残留谓词的内侧

    并行循环和嵌套循环 This article is the second part of the Nested Loop Join Series. In the first part, Introdu ...

  8. MySQL查询优化之二:连接原理(Joins)

    在关系型数据系统(RDBMS)中,数据被存储分布在大量不同的表中.但查询的时候,我们经常需要将多个数据源合并成一个结果集,这个合并的过程,即是连接. 通常情况下,连接会提供一个连接条件(join co ...

  9. 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...

最新文章

  1. 现代软件工程 第七章 【MSF】练习与讨论
  2. 学习新 api 的思考过程 4.18
  3. ##连接符和#符的使用
  4. itil 容量管理流程_大项目定制,智能IT运营管理平台建设解决方案
  5. 学计算机毁一生,大学中4大“天坑”级别的专业,学了毁一生,家里没钱不要学...
  6. bShare一个强大的网页分享插件
  7. [转载] 使用Python在ArcGIS中编程杂谈
  8. (day 48 - 双端队列的使用 ) 剑指 Offer 59 - II. 队列的最大值
  9. Django中应用celery
  10. centos 中如何将python更新到最新的版本
  11. 汉字转拼音(较完整)
  12. 2星|《反焦虑思维》:冥想、遛狗、散步、打哈欠等可以缓解焦虑
  13. AT32 MCU低功耗模式--AT_SURF案例19
  14. 厚积薄发打卡Day26:狂神说Java之JUC并发编程<代码+笔记>(上)
  15. 教资(信息技术学科知识与教学能力)13-1信息技术课程知识
  16. swift4.0 方法监听Selector写法总结
  17. ps处理黑眼圈黑眼袋的方法集合
  18. Neural Baby Talk学习笔记
  19. 利用C语言打印杨辉三角
  20. iconic 框架中的滚动条高度

热门文章

  1. Pyqt关闭并打开新窗口的实现
  2. 【安安教具】-【数学】-【数轴】模拟器 教你如何用python制作数轴模拟器 python 小项目创作
  3. Happytime RTSP Pusher,命令行工具提供
  4. python常用代码记录-像素值除以255
  5. 数据库查询中 where 和group by 能否一起使用?
  6. 基于keil5自动配置stm32f103标准库的官网freertos移植
  7. 【主动选择,远离忧患】云和恩墨大讲堂电子期刊第十一期
  8. android将一个long型转成时间字符串
  9. 外呼系统对于多种行业
  10. centos开机启动流程