原文地址:Nested-Loop Join Algorithms

mysql在表之间执行连接操作,包括了使用循环嵌套算法或者其他在此基础上的变形。

循环嵌套连接算法:

一个简单的嵌套循环连接(NLJ:nested-loop jon)算法,每一次运用一个循环从第一个表里读取行,通过每一行去嵌套循环连接第二个表。这个过程被重复了多次,因为还有剩余的待连接的表。

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

Table Join Type

t1 range

t2 ref

t3 ALL

如果使用一个简单的NL算法,那么连接过程如下:

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算法一次将一行从外部循环传递到内部循环,所以通常会在内部循环中多次读取处理的表。

块循环嵌套连接算法:

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

Mysql的连接缓冲区有以下特点:

1,连接缓存可以被使用,当join的类型为:All、index、range。在外连接中使用缓冲区,也被描述在:Block Nested-Loop and Batched Key Access
Joins

2,绝不会为第一个非常数表分配一个缓冲区,尽管它是All或者index类型

3,仅会把连接中必要的列存入它的连接缓存,而不是整行数据

4,连接缓存的大小的系统变量定义了每一个被用于查询的连接缓存的大小

5,每一个可以被缓存的连接都会被分配一个缓冲区,所以,一个查询可以会需要使用几个连接缓存

6,一个缓存区在它执行连接之前建立,而在查询结束后释放

例如:之前的NLJ算法(没有缓存),通过缓存,这个连接会像下面所描述的一样被执行:

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 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足够大以容纳所有以前的行组合。但是,尽管join_buffer_size足够大,但是它并没有变得更快!

【mysql优化 3】嵌套循环连接算法的更多相关文章

  1. MySQL优化二(连接优化和缓存优化)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  2. 【mysql 优化 4】嵌套连接优化

    原文地址:Nested Join Optimization 与SQL标准相比,table_factor的语法被扩展.后者仅接受table_reference,而不是一对括号内的列表.如果我们将tabl ...

  3. MySql数据库3【优化4】连接设置的优化

    1.wait_timeout / interactive_timeout  连接超时 服务器关闭连接之前等待活动的秒数.MySQL所支持的最大连接数是有限的,因为每个连接的建立都会消耗内存,因此我们希 ...

  4. 【mysql 优化 5】左连接和右连接优化

    原文地址:8.2.1.8 Left Join and Right Join Optimization mysql以下列方式实现一个A left join B 连接条件: 1,表B设置为依赖于表A和A所 ...

  5. 程序员收藏必看系列:深度解析MySQL优化(二)

    程序员收藏必看系列:深度解析MySQL优化(一) 性能优化建议 下面会从3个不同方面给出一些优化建议.但请等等,还有一句忠告要先送给你:不要听信你看到的关于优化的“绝对真理”,包括本文所讨论的内容,而 ...

  6. MYSQL 优化--inner buffer 与关联查询变等值查询

    转自:https://www.2cto.com/database/201312/262376.html 在数据库的应用中,我们经常需要对多表进行连表操作来获得关系型的数据,因此,应该更加的掌握好Mid ...

  7. Mysql优化-索引

    1. 索引的本质 MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构. 数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度尽可能的快,因此 数据库系统的设计者会从查询算 ...

  8. MySQL 优化【转】

    MySQL常见的优化手段分为下面几个方面: SQL优化.设计优化,硬件优化等,其中每个大的方向中又包含多个小的优化点 下面我们具体来看看~ SQL优化 此优化方案指的是通过优化 SQL 语句以及索引来 ...

  9. 如何干涉MySQL优化器使用hash join

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 前言 实验 总结 前言 数据库的优化器相当于人类的大 ...

随机推荐

  1. Python3基础02(列表和字符串处理)

    str = 'Runoob'# 输出字符串print(str) # 输出第一个到倒数第二个的所有字符print(str[0:-1]) # 输出字符串第一个字符print(str[0]) # 输出从第三 ...

  2. Windows服务管理

    按键:win+R 输入:services.msc “服务和应用程序”界面选项打开 * sc命令的使用:create(创建) delete(删除)等 * service可执行文件路径的修改:win+R ...

  3. java面试题(杨晓峰)---第三讲谈谈final、finally、finalize有什么不同?

    java语言有很多看起来相似,但用途却完全不相同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点. 今天我要问你一个基础的java经典题目,谈谈final.finally.finali ...

  4. DIV在另一个DIV里面垂直居中,水平居中

    HTML: <div class="parent"> <div class="children"> <div class=&quo ...

  5. CodeForces 77C Beavermuncher-0xFF (树形dp)

    不错的树形dp.一个结点能走多次,树形的最大特点是到达后继的路径是唯一的,那个如果一个结点无法往子结点走,那么子结点就不用考虑了. 有的结点不能走完它的子结点,而有的可能走完他的子节点以后还会剩下一些 ...

  6. noip模拟赛#45

    T1:n<=1e6,求最小的区间包含(1,m)的所有数. =>双指针扫一遍即可 #include<cstdio> #include<cstring> #includ ...

  7. JS给数字加千位分隔符

    本文原链接:https://www.jianshu.com/p/928c68f92c0c JavaScript实现千位分隔符 将普通的数字转换为带千位分隔符格式的数字字符串是一个非常常见的问题,千位分 ...

  8. c#中的里氏转换和Java中强制类型转换在多态中的应用

    在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...

  9. Python语言编写脚本时,对日期控件的处理方式

    对日期控件,日期控件的输入控一般是不能手动输入的:把readonly属性去掉就好 其实很简单,我们不去搞时间日期空间,我们把它当成一个普通的input框处理就好了! 但是,很多此类型input框都是禁 ...

  10. JQuery EasyUI学习记录(五)

    1.datagrid使用方法(重要) 1.1将静态html渲染为datagrid样式 <!--方式一: 将静态html渲染为datagrid样式 --> <table class=& ...