MySQL查询优化之五-嵌套循环连接算法(Nested-Loop Join Algorithms)

MySQL查询优化之五-嵌套循环连接算法(Nested-Loop Join Algorithms)


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

环境:
MySQL版本:5.5.15
操作系统:windows

本文讨论嵌套循环连接算法(Nested-Loop Join Algorithms)。

MySQL使用嵌套循环算法或其变种来进行表之间的连接。

这里主要介绍两种算法:
嵌套循环连接算法(Nested-Loop Join Algorithm)和块嵌套循环连接算法(Block Nested-Loop Join Algorithm)

1.嵌套循环连接算法(Nested-Loop Join Algorithm)

一个简单的嵌套循环连接(NLJ)算法从循环中的第一个表中逐行读取一行,将每行传递给处理连接中下一个表的嵌套循环。 这个过程会重复多次,因为还有剩余的表被连接。

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

Table   Join Type
t1      range
t2      ref
t3      ALL

如果使用一个简单的NLJ算法,连接就像这样处理:

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算法从外循环向内循环一次传递一行,因此它通常会多次读取在内循环中处理的表。

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

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

MySQL连接缓冲具有以下特点:

  • 当连接的类型为ALL或者index(换句话说,当没有可能的键可以被使用,并且数据行或者索引行分别被完全扫描时)或者range时,可以使用连接缓冲。
  • 一个连接缓冲区永远不会分配给第一个非常量表,即使它是ALL或index。
  • 只有特定的列存储在其连接缓冲区中,而不是整行。
  • join_buffer_size系统变量确定用于处理查询的每个连接缓冲区的大小。
  • 为每个可以缓冲的连接分配一个缓冲区,因此可以使用多个连接缓冲区来处理给定的查询。
  • 连接缓冲区在执行连接之前被分配并在查询完成后被释放。

对于前面介绍的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足够大以容纳所有先前的行组合。 在这一点上,没有速度通过使其更大。


Reference:
https://dev.mysql.com/doc/refman/5.5/en/nested-loop-joins.html


觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
微信
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

你可能感兴趣的:(MySQL,MySQL优化)