博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql的NLJ_mysql的join buffer-阿里云开发者社区
阅读量:5106 次
发布时间:2019-06-13

本文共 893 字,大约阅读时间需要 2 分钟。

最近同事在讨论mysql 的join buffer实现,于是做了以下实验:

join-buffer-11.jpg

从sql的执行计划中我们可以看到mysql使用using join buffer算法来优化改sql的查询,那么他的原理是什么?又是怎么样来实现的?在sql中注意到我加了hint提示符straight_join让,强制mysql按照查询中出现的顺序来连接表,意思是让t1表作为驱动表,t1中有多少记录,那么就要对t2表关联多少次(由于t2表为为我们子查询中的结果集,mysql在处理子查询的时候,把他子查询的结果放到临时表中,把临时表当做普通通进行处理,也就是执行计划中出现derived2,注意这里的临时表不在有id的索引了);

那么t2表就被多次的扫描,如果t2表的结果集非常的大,那么就会造成性能上的问题,所以mysql在这里对其进行了优化,采用Block Nested-Loop Join (BNL),具体算法描述为:

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 {

flush_buffer();

}

empty buffer

}

}

flush_buffer() {

for each row in t3 {

for each t1, t2 combination in join buffer {

if row satisfies join conditions,      send to client

}

}

}

join-buffer-2.jpg从图中可以看到把t1和t2的结果集放到join buffer中,而不用每次t1和t2关联后马上有和t3关联,这也是没有必要的,然后只需一次扫描t3即可完成这个查询;需要注意的是join buffer中只保留查询结果中出现的列值,它的大小不依赖于表的大小,我们在伪代码中看到当join buffer被填满后,mysql将会flush buffer。

转载地址:http://wqudv.baihongyu.com/

你可能感兴趣的文章
使用CruiseControl搭建自己的持续集成环境
查看>>
(一)bootstrap第三方扩展——Font Awesome
查看>>
Cent OS 6.5下源码安装php7.2
查看>>
Java提要
查看>>
OpenLayers 项目完整分析——(二)源代码总体结构分析
查看>>
python多线程和GIL全局解释器锁
查看>>
Mac OS10.9.2下的eclipse Pydev开发环境配置
查看>>
Bzoj3230: 相似子串
查看>>
有理想的程序员必须知道的15件事
查看>>
JVM学习笔记二_对象的创建、布局和定位
查看>>
python数据类型内置方法 字符串和列表
查看>>
mysql数据库还原出错ERROR:Unknown command ‘\\’解决手记
查看>>
python--sys模块
查看>>
论 <%@taglib prefix="s" uri="/struts-tags" %> 的重要性
查看>>
Linux 命令
查看>>
GBDT 总结文档
查看>>
ZJOI2006 物流运输
查看>>
easyui-menu 宽度自适应
查看>>
git 将本地项目关联到远程仓库
查看>>
网络开始---多线程---NSThread-02-线程状态(了解)(三)
查看>>