小表驱动大表, 兼论exists和in
给出两个表,A和B,A和B表的数据量,
for i in A
for j in B
if j.id == i.id then ....
for i in B
for j in A
if j.id == i.id then ....
Duration | Fetch | Rows | SQL | |
exists | 0.17 | 6.2 | 924 | SELECT * FROM user u where exists (SELECT 0 FROM plan p where p.user_id=u.user_id ) |
in | 0.01 | 0.0 | 924 | SELECT * FROM user u where user_id in (SELECT user_id FROM plan) |
dict = hash(B)
for i in A
if i in dict then ...
如果如此,当然会快很多了。并且之前提到过,B表小的时候,用in,在这里也正好被放到一个Hash表里面。
1、hash join 就是哈希连接,当一个表或多个表上没有索引时,或者数据库服务器必须从所有连接表读取大量行的时候,就用这种方法。
2、orcale7.3以后才出来一种hash join的新的连接技术,hash join只能用于相等连接。
3、相对于以前的nested loop join连接技术,hash join更适合处理大型结果集,而且不需要在驱动表上建索引。
4、hash算法就是在两个表连接的时候,首先要区分大表和小表,小表用S来表示,大表用B来表示,然后就把小表S表放在一个内存的hash table中。
5、若这个小表S表还是太大,放不进去hash table中,就应该对这个hash table要分区,对于大表B表也是要放在内存中的,若B表也是太大,那也要进行分区处理。
6、这样的话,S表就分开若干个区,B表也分成若干个区,这样就开始各个分区之间的互连。
7、除了hash table的分区后,还有一个就是hash area内存的感念,就是逐个处理S与B的各个子集相连情况,首先把小表放在内存里,内存是高速缓冲区,速度快,大表放在慢速的存储区内,从慢速区内读条数据后,再与高速区的做循环,这样肯定会很快的,反过来就慢了,所以优化始终强调小表套大表,小表在高速缓冲区内执行,大表在慢速区放着。
8、S与B的两两相连时,会出现脚色互换的的,当B表的某个分区少的话,那这个小B表进如hash area中做主表。
9、hash join的核心就是确认小表为驱动表,在算法执行之前大小表都要拆分,会有两者角色互换的情况,关键是看谁的数量小,小的进高速内存跑循环,大的在外面有IO处理过程。
10、总之hash join适合于小表与大表相连,返回大型结果集的连接。
从这里摘的:http://blog.sina.com.cn/s/blog_648760e30101b1uh.html
小表驱动大表, 兼论exists和in的更多相关文章
- 查询优化--小表驱动大表(In,Exists区别)
Mysql 系列文章主页 =============== 本文将以真实例子来讲解小表驱动大表(In,Exists区别) 1 准备数据 1.1 创建表.函数.存储过程 参照 这篇(调用函数和存储过程批 ...
- 6.2 小表驱动大表(exists的应用)
1. 优化原则:小表驱动大表,即小数据集驱动大数据集. select * from A where id in (select id from B) 等价于: for select id from B ...
- Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
//假设一个for循环 ; $i < ; $i++) { ; $i < ; $j++) { } } ; $i < ; $i++) { ; $i < ; $j++) { } } ...
- MySQL高级知识(十六)——小表驱动大表
前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...
- MySql 小表驱动大表
在了解之前要先了解对应语法 in 与 exist. IN: select * from A where A.id in (select B.id from B) in后的括号的表达式结果要求之输出一列 ...
- 了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
一.为什么要用小表驱动大表 1.驱动表的定义 当进行多表连接查询时, [驱动表] 的定义为: 1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表] 2)未指定联接条件时,行数少的表为[驱动表 ...
- 3.mysql小表驱动大表的4种表连接算法
小表驱动大表 1.概念 驱动表的概念是指多表关联查询时,第一个被处理的表,使用此表的记录去关联其他表.驱动表的确定很关键,会直接影响多表连接的关联顺序,也决定了后续关联时的查询性能. 2.原则 驱动表 ...
- 【Spark调优】小表join大表数据倾斜解决方案
[使用场景] 对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案. [解决方案] ...
- hive join 优化 --小表join大表
1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...
随机推荐
- grunt安装与配置
安装 CLI npm install -g grunt-cli//全局安装 npm init //初始化package.json npm init 命令会创建一个基本的package.json文件 ...
- 第三次作业——for 语句及分支结构else-if
1.本次学习到的知识点: (1)else-if的一般形式:if(表达式1)语句1:else if(表达式2)语句2:........else if(表达式n-1)语句n-1:else语句n: (2)遇 ...
- SELECT控件操作的JS代码示例
SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 安装和使用Visual Studio 2013并进行简单的单元测试
现在我正在安装visual studio 2013,我听说好多同学都在安装visual studio 2015,但是他好像只支持Win10吧,我就退而求其次安装了visual studio 2013. ...
- background-position
在学习网页"换肤"效果时:对background-position的理解更深了. 这是我使用的一整张图片:
- ubuntu14 opencv python 安装
本文记录了Ubuntu 14.04下使用源码手动安装OpenCV 3.0的过程.此外记录了在Python中安装及载入OpenCV的方法. 1.安装OpenCV所需的库(编译器.必须库.可选库) GCC ...
- js对象详解
js自定义对象 一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在J ...
- 关于使用flexible.js自适应页面,发现文字很多时,字体会变大的问题的原因和解决方案
具体自己还没研究过 先把别人写的文章收藏一下 主要是webkit 有一个Font Boosting特性,当文字小到一定程度的时候会触发这个属性,放大字体来提升页面的阅读感 . http://www.3 ...
- 优先队列 :Priority Queue
PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于优先级堆的极大优先级队列.优先级队列是不同于先进先出队列的另一种队列. 每次从队列中取出的是具有最高优先权的元素.如果 ...