我们都知道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 Join

Index Nested Loop Join

Block Nested Loop Join

外表扫描次数

1

1

1

内表扫描次数

R

0

读取记录次数

R + R * S

R + RS_Matches

比较次数

R * S

R * IndexHeight

R * S

回表次数

0

RS_Matches

0

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

mysql nest loop伪代码_Nested Loop Join相关推荐

  1. mysql while 游标_mysql 游标 loop while 的使用

    项目需求:对表进行重新构建,这个用java的缺点是数据的传送以及遍历的话会消耗更多的资源,因此使用mysql的存储过程进行构建. 具体要求:跳过原本设置的假期和课程本身的假期对数据进行重排. 1.游标 ...

  2. MySQL EXPLAIN详解,left join和in优化详解,以及optimizer_trace跟踪语句使用

    最近优化mybaits的sql语句性能,网上查了查mysql的explain用法,这里记录一下,希望对大家有帮助. EXPLAIN简述: explain为mysql提供语句的执行计划信息.可以应用在s ...

  3. RuntimeError: Cannot run the event loop while another loop is running

    代码如下: import tornado.ioloop import tornado.web from tornado.httpclient import HTTPClient, AsyncHTTPC ...

  4. python报错:Cannot run the event loop while another loop is running

    我是在TensorFlow的教程中发现的报错: 执行这行代码会报错:Cannot run the event loop while another loop is running 解决方法: 在 ju ...

  5. loop与for loop分别实现乘法口诀表

    loop与for loop分别实现乘法口诀表 set serveroutput on; declare i number(4,0):=1; j number(4,0); begin loop exit ...

  6. Loop Pipelining and Loop Unrolling

    文章目录 Loop Pipelining canci pipelining and unrolling improve hardware function's performance by explo ...

  7. oracle 非等值关联 优化,Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)...

    查询优化器 Oracle的查询优化器(QO)分为两种: 1. RBO:Ruled-Based Optimization, 基于规则的优化器: 2. CBO :Cost-Based Optimizati ...

  8. mysql单单写join_MySQL系列之Join大法

    1. Index Nested-Loop Join 概念解释: 假设有t1,t2两张表,在join连接的时候,t1表驱动t2表,t1走的全部扫描,t2表使用了索引, 则这个时候join就使用了&quo ...

  9. mysql主动自增可以_Mysql join联表及id自增实例解析

    join的写法 如果用left join 左边的表一定是驱动表吗?两个表的join包含多个条件的等值匹配,都要写道on还是只把一个写到on,其余写道where部分? createtablea(f1in ...

最新文章

  1. Codechef SEAARC Sereja and Arcs (分块、组合计数)
  2. rank()over 函数的使用
  3. gdb tui 安装_GDB 单步调试汇编
  4. 【chorme插件开发】第四节:html+js实现的功能插件开发实例
  5. 3-4:一个简单的HTTP服务器
  6. 向前的快捷键_平面设计基础知识:平面设计师应该知道的快捷键。
  7. 设计模式总结 —— 单例设计模式
  8. js获取浏览器高度 宽度
  9. HP JetDirect 170X 配置
  10. C语言:输入10个整数,找出其中绝对值最小的数
  11. 【原创】在winform程序中实现在IE浏览器中打开一个新的页面,全屏化并屏蔽IE窗口的工具栏和地址栏
  12. phpwind9.0 read.php 修改,phpwind9.0模板制作教程——制作论坛风格
  13. 镜头和相机的匹配问题
  14. 北航计算机考研机考,11北航计算机复试上机
  15. amoeba mysql exists_Amoeba实现MySQL数据库读写分离
  16. 0035:虫子吃苹果(C++)
  17. 利用UltraLibrarian生成Altium designer原理图、PCB封装
  18. vaadin浅尝辄止
  19. 人机工程学座椅设计_人机工程学座椅设计.ppt
  20. 爱因斯坦数学不好,为何能建立广义相对论?

热门文章

  1. jieba分词怎么操作_常用分词工具使用教程
  2. caused by: java.lang.outofmemory_Caused by: java.lang.OutOfMemoryError: PermGen space
  3. 鸿蒙车载智慧屏评测,华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀?
  4. HALCON:与C++交互
  5. HALCON标定板简介
  6. 视觉平台搭建——LED光源介绍
  7. android 3d侧拉抽屉,iOS动画指南 - 4.右拉的3D抽屉效果
  8. Node.js 文档(目录)
  9. 入门系列之使用fail2ban防御SSH服务器的暴力破解攻击 1
  10. Hexo NexT主题添加点击爱心效果