MySQL的JOIN(二):JOIN原理

表连接算法

Nested Loop Join(NLJ)算法: 
首先介绍一种基础算法:NLJ,嵌套循环算法。循环外层是驱动表,循坏内层是被驱动表。驱动表会驱动被驱动表进行连接操作。首先驱动表找到第一条记录,然后从头扫描被驱动表,逐一查找与驱动表第一条记录匹配的记录然后连接起来形成结果表中的一条记。被驱动表查找完后,再从驱动表中取出第二个记录,然后从头扫描被驱动表,逐一查找与驱动表第二条记录匹配的记录,连接起来形成结果表中的一条记录。重复上述操作,直到驱动表的全部记录都处理完毕为止。这就是嵌套循环连接算法的基本思想,伪代码如下。

    foreach row1 from t1
foreach row2 from t2
if row2 match row1 //row2与row1匹配,满足连接条件
join row1 and row2 into result //连接row1和row2加入结果集

首先加载t1,然后从t1中取出第一条记录,之后加载t2表,与t2表中的记录逐个匹配,连接匹配的记录。

Block Nested Loop Join(BNLJ)算法: 
再介绍一种高级算法:BNLJ,块嵌套循环算法,可以看作对NLJ的优化。大致思想就是建立一个缓存区,一次从驱动表中取多条记录,然后扫描被驱动表,被驱动表的每一条记录都尝试与缓冲区中的多条记录匹配,如果匹配则连接并加入结果集。缓冲区越大,驱动表一次取出的记录就越多。这个算法的优化思路就是减少内循环的次数从而提高表连接效率。

影响性能的因素

1.内循环的次数:现在考虑这么一个场景,当t1有100条记录,t2有10000条记录。那么,t1驱动t2与t2驱动t1,他们之间在效率上孰优孰劣?如果是单纯的分析指令执行次数,他们都是100*10000,但是考虑到加载表的次数呢。首先分析t1驱动t2,t1表加载1次,t2表需要加载100次。然后分析t2驱动t1,t2表首先加载1次,但是t1表要加载10000次。所以,t1驱动t2的效率要优于t2驱动t1的效率。由此得出,小表驱动大表能够减少内循环的次数从而提高连接效率。 
另外,如果使用Block Nested Loop Join算法的话,通过扩大一次缓存区的大小也能减小内循环的次数。由此又可得,设置合理的缓冲区大小能够提高连接效率

2.快速匹配:扫描被驱动表寻找合适的记录可以看做一个查询操作,如何提高查询的效率呢?建索引啊!由此还可得出,在被驱动表建立索引能够提高连接效率

3.排序:假设t1表驱动t2表进行连接操作,连接条件是t1.id=t2.id,而且要求查询结果对id排序。现在有两种选择,方式一[...ORDER BY t1.id],方式二[...ORDER BY t2.id]。如果我们使用方式一的话,可以先对t1进行排序然后执行表连接算法,如果我们使用方式二的话,只能在执行表连接算法后,对结果集进行排序(Using temporary),效率自然低下。由此最后可得出,优先选择驱动表的属性进行排序能够提高连接效率。

最新文章

  1. 理解CSS边框border
  2. 化茧成蝶,开源NetWorkSocket通讯组件
  3. 关于Mesos和Kubernetes的区别
  4. nginx 设置 fastcgi缓存
  5. 利用Jquery使用HTML5的FormData属性实现对文件的上传
  6. sql修改表结构、临时表应用
  7. Python 基础【第二篇】python操作模式
  8. OpenStack镜像制作-CentOS
  9. linux cat命令的<<EOF
  10. lldb 命令
  11. Xcode-之Alcatraz
  12. UEditor Golang上传图片与附件
  13. 更改手机系统的User-Agent & okhttp
  14. spring中的aop演示
  15. cocos2d JS-(JavaScript) 几种循环遍历对象的比较
  16. 【教程】ubuntu下安装samba服务器
  17. liblas 1.8.1编译安装
  18. 直接修改class文件内容即使是文本会导致App异常,正确方式是修改java再用生成的class替换掉原有的class
  19. Codeforces Round #524 (Div. 2) Solution
  20. PHP 查找二维数组中是否有指定字符串的字段

热门文章

  1. MessagePack Java 0.6.X 可选字段
  2. Python基础之变量和常量
  3. C与C++ 中 struct和typedef struct
  4. FinalCutPro快捷键
  5. PM2工作原理
  6. java8 lamda 表达式
  7. Oracle12C SGA PGA UGA
  8. java list对象按照某个属性去重
  9. golang mysql 如何设置最大连接数和最大空闲连接数
  10. redis复制集