金沙贵宾会官网|金沙贵宾会登录-官网

【A】金沙贵宾会官网超高的返奖率为娱乐者提供资金保障,所以金沙贵宾会登录官网更加的方便了你的娱乐,申请88元彩金,因为在当中不仅仅只有游戏。

Join算法小结

日期:2019-12-08编辑作者:网络技术

金沙贵宾会登录官网,MySQL中Nested-Loop Join算法小结,

 不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天我就看了看MySQL的连接算法,嗯,现在来说还是不支持Hash Join,只有Nested-Loop Join,那今天就总结一下我学习的心得吧。

     Nested-Loop Join基本算法实现,伪代码是这样:

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

     这段代码很简单,虽然我也不怎么会写代码,但是我还是看得懂的。这里假设有三张表,t1, t2, t3,这段代码,分别会展现出explain计划里的range, ref和ALL,表现在SQL执行计划层里,t3就会进行一次全表扫描,我今天在这个地方看到了一个很妖的优化SQL方法,Straight-join:

     当然了,MySQL自己在这个算法基础上,演进出了Block Nested-Loop join算法,其实基本上和上面的算法没有区别,伪代码如下:

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

     这个算法,将外层循环的数据缓存在join buffer中,内层循环中的表回合buffer中的数据进行对比,从而减少循环次数,这样便可以提高效率。官网上有个example,我有点没有看明白:如果有10行被缓存到了buffer里,这10行被传给了内层循环,内层循环的所有行都会和buffer中的这10行进行对比。原文是这样的:  

金沙贵宾会官网,For example, if 10 rows are read into a buffer and the buffer is passed to the next inner loop, each row read in the inner loop can be compared against all 10 rows in the buffer
      如果S指的是t1, t2组合在缓存中的大小,C是这些组合在buffer中的数量,那么t3表被扫描的次数应该是:

      (S * C)/join_buffer_size + 1

     根据这个算式,join_buffer_size越大,扫描的次数越小,如果join_buffer_size到了能缓存所有之前的行组合,那么这时就是性能最好的时候,之后再增大也就没有什么效果了。

在有索引的情况下,MySQL会尝试去使用Index Nested-Loop Join算法,在有些情况下,可能Join的列就是没有索引,那么这时MySQL的选择绝对不会是最先介绍的Simple Nested-Loop Join算法,因为那个算法太粗暴,不忍直视。数据量大些的复杂SQL估计几年都可能跑不出结果,如果你不信,那就是too young too simple。或者Inside君可以给你些SQL跑跑看。

Simple Nested-Loop Join算法的缺点在于其对于内表的扫描次数太多,从而导致扫描的记录太过庞大。Block Nested-Loop Join算法较Simple Nested-Loop Join的改进就在于可以减少内表的扫描次数,甚至可以和Hash Join算法一样,仅需扫描内表一次。

您可能感兴趣的文章:

  • 超详细mysql left join,right join,inner join用法分析
  • MySQL JOIN之完全用法
  • mysql多表join时候update更新数据的方法
  • mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录
  • 浅析Mysql Join语法以及性能优化

Join算法小结, 不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说...

本文由金沙贵宾会官网发布于网络技术,转载请注明出处:Join算法小结

关键词:

基于Docker铺排Lepus及MySQL慢查询配置,安装配备

您可能感兴趣的文章: MySQL性能监控软件Nagios的安装及配置教程 percona-toolkit对MySQL的复制和监控类操作教程 一、环境说...

详细>>

编程语言,IOS阶段学习第三天笔记

IOS阶段学习第三天笔记(运算符),ios第三天                                         IOS学习(C语言)知识点整理...

详细>>

奥迪Q52硬件必要,WindowsCEO应该把升高的钱花在哪

我们常常会面临这样的问题:我们只有X人民币可用在Windows系统升级上,但是这些钱该用在哪里呢?另外,这在服务器...

详细>>

快速诊断内存泄漏

金沙贵宾会登录官网,这年立刻就到了界限。下八个月自己比较忙,发生了太多的业务,八个月都没写博客了,以后...

详细>>