mysql nest loop伪代码_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 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相关推荐
- mysql while 游标_mysql 游标 loop while 的使用
项目需求:对表进行重新构建,这个用java的缺点是数据的传送以及遍历的话会消耗更多的资源,因此使用mysql的存储过程进行构建. 具体要求:跳过原本设置的假期和课程本身的假期对数据进行重排. 1.游标 ...
- MySQL EXPLAIN详解,left join和in优化详解,以及optimizer_trace跟踪语句使用
最近优化mybaits的sql语句性能,网上查了查mysql的explain用法,这里记录一下,希望对大家有帮助. EXPLAIN简述: explain为mysql提供语句的执行计划信息.可以应用在s ...
- RuntimeError: Cannot run the event loop while another loop is running
代码如下: import tornado.ioloop import tornado.web from tornado.httpclient import HTTPClient, AsyncHTTPC ...
- python报错:Cannot run the event loop while another loop is running
我是在TensorFlow的教程中发现的报错: 执行这行代码会报错:Cannot run the event loop while another loop is running 解决方法: 在 ju ...
- loop与for loop分别实现乘法口诀表
loop与for loop分别实现乘法口诀表 set serveroutput on; declare i number(4,0):=1; j number(4,0); begin loop exit ...
- Loop Pipelining and Loop Unrolling
文章目录 Loop Pipelining canci pipelining and unrolling improve hardware function's performance by explo ...
- oracle 非等值关联 优化,Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)...
查询优化器 Oracle的查询优化器(QO)分为两种: 1. RBO:Ruled-Based Optimization, 基于规则的优化器: 2. CBO :Cost-Based Optimizati ...
- mysql单单写join_MySQL系列之Join大法
1. Index Nested-Loop Join 概念解释: 假设有t1,t2两张表,在join连接的时候,t1表驱动t2表,t1走的全部扫描,t2表使用了索引, 则这个时候join就使用了&quo ...
- mysql主动自增可以_Mysql join联表及id自增实例解析
join的写法 如果用left join 左边的表一定是驱动表吗?两个表的join包含多个条件的等值匹配,都要写道on还是只把一个写到on,其余写道where部分? createtablea(f1in ...
最新文章
- Codechef SEAARC Sereja and Arcs (分块、组合计数)
- rank()over 函数的使用
- gdb tui 安装_GDB 单步调试汇编
- 【chorme插件开发】第四节:html+js实现的功能插件开发实例
- 3-4:一个简单的HTTP服务器
- 向前的快捷键_平面设计基础知识:平面设计师应该知道的快捷键。
- 设计模式总结 —— 单例设计模式
- js获取浏览器高度 宽度
- HP JetDirect 170X 配置
- C语言:输入10个整数,找出其中绝对值最小的数
- 【原创】在winform程序中实现在IE浏览器中打开一个新的页面,全屏化并屏蔽IE窗口的工具栏和地址栏
- phpwind9.0 read.php 修改,phpwind9.0模板制作教程——制作论坛风格
- 镜头和相机的匹配问题
- 北航计算机考研机考,11北航计算机复试上机
- amoeba mysql exists_Amoeba实现MySQL数据库读写分离
- 0035:虫子吃苹果(C++)
- 利用UltraLibrarian生成Altium designer原理图、PCB封装
- vaadin浅尝辄止
- 人机工程学座椅设计_人机工程学座椅设计.ppt
- 爱因斯坦数学不好,为何能建立广义相对论?
热门文章
- jieba分词怎么操作_常用分词工具使用教程
- caused by: java.lang.outofmemory_Caused by: java.lang.OutOfMemoryError: PermGen space
- 鸿蒙车载智慧屏评测,华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀?
- HALCON:与C++交互
- HALCON标定板简介
- 视觉平台搭建——LED光源介绍
- android 3d侧拉抽屉,iOS动画指南 - 4.右拉的3D抽屉效果
- Node.js 文档(目录)
- 入门系列之使用fail2ban防御SSH服务器的暴力破解攻击 1
- Hexo NexT主题添加点击爱心效果