原文地址: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. userBean-作用范围application

    package com.java1234.model; public class Student { private String name;private int age; public Strin ...

  2. LeetCode Remove Linked List Elements 删除链表元素

    题意:移除链表中元素值为val的全部元素. 思路:算法复杂度肯定是O(n),那么就在追求更少代码和更少额外操作.我做不出来. /** * Definition for singly-linked li ...

  3. 关于“为何Unicode中文字符占取2个字节,而 UTF-8却占3个字节”的网络解释修正

    学到编码时,有个疑问——好好的占2字节的Unicode不用,却要用占3字节的UTF-8编码.发明 UTF-8的初衷不就是为了修正Unicode中任何字符至少占用2个字节的弊端吗? 虽然UTF-8英文字 ...

  4. MovieReview—A dog's purpose(一只狗的使命)

    Be Here Now                                                             A dog in the movie was reinc ...

  5. 2017-3-7-lint82single-number

    2017-3-7-lint82single-number 在河之洲 算法 小书匠 problem 82single-number/ solution int singleNumber(vector&l ...

  6. 文本框复制代码,兼容大部分浏览器(ZeroClipboard插件、附件)

    ;;list-style-type:none;} a,img{;} body{font:12px/180% Arial, Helvetica, sans-serif ,"新宋体"; ...

  7. Bootstrap历练实例:标签页内的下拉菜单

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  8. 01_2_Servlet简介

    01_2_Servlet简介 1. Servlet简介 Servlet是服务器小应用程序 用来完成B/S架构下,客户端请求的响应处理 平台独立,性能优良,能以线程方式运行 Servlet API为Se ...

  9. c++作业:使用函数调用的方法,实现求两个整数中大的数的程序。

    #include <iostream> using namespace std; int main(){ //从键盘接收两个整数,保存在变量num1和num2中 cout<<& ...

  10. javascript自定义一个迭代器

    js中对象分为可迭代和不可迭代 如果是可迭代哪它就会有一个[Symbol.iterator] 函数 这个函数就是对象的迭代器函数,如用for of 如果遍历的对象没有这个迭代方法那么就会报错 for ...