MySQL在多表之间执行join时,利用一种nested-loop algorithm 或者其变种;(嵌套循环)

 Nested-Loop Join Algorithm

     一个简单的嵌套循环连接(NLJ)算法 从第一个表读取一行,然后传递给Join中的其他表依次读取,过程一直重复剩余的表都被Join。

假设在三个表t1,t2,t3做连接时:

Table   Join Type
t1 range
t2 ref
t3 ALL

如下:

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
}
}
}

因为嵌套循环连接每次传递一行到内表中,通常要在内表处理好多次。

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

      Block Nested-loop(BNL)连接算法利用缓存外部循环读取的数据行来减少在内表中读取的次数。e.g.假如外表读取并缓存10行数据,缓存传递给以下个内表,内表可以在缓存中直接比较这10行数据,而不用再重新读取外表的10行数据,以数量级的方式减少内表读取次数。

MYSQL 用 join Buffer有一下几种条件:

1: join buffer size 系统变量决定了每个join buffer的大小。

2:join buffer可以用于all, index,range表访问类型。

3: 每个join分配一个buffer,所以一个查询可以用多个join buffer.

4:  如果第一个表为noconst table,则join buffer不会被分配,即使他的访问类型为all或者index.

5:  Join buffer在执行是分配,查询完成后释放。

6:  join Buffer只缓存感兴趣的(需要返回给client)的列,并不是一整行数据都缓存。

比较之前的NLJ算法(没有Buffer):

for each row in t1 matching range {
for each row in t2 matching reference key {
store used columns from t1, t2 in join buffer
if 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 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
}
}
}

如果t1,t2保存在连接缓存的组合大小为S,组合个数为C,那么t3扫描次数是:

(S * C)/join_buffer_size + 1

t3的扫描次数会随着join_buffer_si增加而减少,当连接缓存增加到了可以包含所有记录,在大也不能减少扫描次数。

Mysql Nested-Loop Join Algorithms的更多相关文章

  1. 1122MySQL性能优化之 Nested Loop Join和Block Nested-Loop Join(BNL)

    转自http://blog.itpub.net/22664653/viewspace-1692317/ 一 介绍  相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说 ...

  2. 44 答疑(三)--join的写法/Simple nested loop join的性能问题/Distinct和group by的性能/备库自增主键问题

    44 答疑(三) Join的写法 35节介绍了join执行顺序,加了straight_join,两个问题: --1 如果用left join,左边的表一定是驱动表吗 --2 如果两个表的join包含多 ...

  3. 禁用nested loop join里的spool

    禁用nested loop join里的spool 转载自: https://blogs.msdn.microsoft.com/psssql/2015/12/15/spool-operator-and ...

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

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

  5. SQL Server nested loop join 效率试验

    从很多网页上都看到,SQL Server有三种Join的算法, nested loop join, merge join, hash join. 其中最常用的就是nested loop join. 在 ...

  6. Merge join、Hash join、Nested loop join对比分析

    简介 我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join ...

  7. 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

  8. join中级篇---------hash join & merge join & nested loop Join

    嵌套循环连接(Nested Loop Join) 循环嵌套连接是最基本的连接,正如其名所示那样,需要进行循环嵌套,嵌套循环是三种方式中唯一支持不等式连接的方式,这种连接方式的过程可以简单的用下图展示: ...

  9. 三大表连接方式详解之Nested loop join和 Sort merge join

    在早期版本,Oracle提供的是nested-loop join,两表连接就相当于二重循环,假定两表分别有m行和n行       如果内循环是全表扫描,时间复杂度就是O(m*n)       如果内循 ...

  10. oracle多表连接方式Hash Join Nested Loop Join Merge Join

    在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:        嵌套循环(Nested  Loops (NL) ...

随机推荐

  1. Linux重启后raid5的名字发生变化

    Linux重启后raid5的名字发生变化 使用raid,每次重启后,都会变换设备路径 比如原来为/dev/md0 重启一次变成了/dev/md127 这个问题,可以使用修改配置文件来解决. 1.mda ...

  2. ubuntu搭建 zabbix3.2 with mysql database (Ubuntu 14.04.5 LTS)

    官网文档 服务构建:https://www.zabbix.com/documentation/3.2/manual/installation/install_from_packages/server_ ...

  3. gitlab markdown支持页面内跳转

    markdown语法: [to_be_link](#id_name) 标题: ## 2.aaa <a name="id_name"></a> 参考: htt ...

  4. Lambda表达式基础

    1.委托的典型用法 1.1定义一个委托: public delegate int AddDelegate(int i, int j); 1.2 定义一个MyClass类,放置一个满足 AddDeleg ...

  5. 【SSD,FIO,SAS选择的一些小结】SSD,FIO,SAS选择的一些小结

    最近重新摊上了数据库,公司核心数据库天天 IO爆满,在研究用SAS 16*RAID10 ,还是RAID10 SSD*6, 还是FIO:no.1 principle, no raid-5 for dat ...

  6. Redis进阶实践之二如何在Linux系统上安装安装Redis

    一.引言      上一篇文章写了"如何安装VMware Pro虚拟机"和在虚拟机上安装Linux操作系统.那是第一步,有了Linux操作系统,我们才可以在该系统上安装Redis. ...

  7. instr函数的"重载"

    .带两个参数的 --模糊查询,comp表的Mobel和show_name字段中含有'张' INSTR(COMP.MOBILE .带三个参数的 ) from dual; 结果: 第三个参数:从字符串&q ...

  8. [PHP] 编译构建最新版PHP源码

    获取最新PHP代码git clone https://git.php.net/repository/php-src.git构建编译环境apt-get install build-essential 编 ...

  9. js测试地址

    很多时候,想写js测试代码,比如在学习的时候.看书敲代码,每次打开VS还是很麻烦的.特别是需要加载一些库的时候. 此时有个工具可以解决: https://jsfiddle.net/ 也是在别人的博客里 ...

  10. Java想要学到精通,这几点一定要掌握

    时代更新换代速度如此之快,尤其是深处互联网行业的java程序员,技术更需要不断更新,只有及时充电,才能不被市场淘汰.千锋Java培训老师今天为大家分享Java程序员学习的6个小技巧. 1.书籍永远是知 ...