开发者社区> 北在南方> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【MySQL】MySQL5.6新特性之Batched Key Access

简介:
+关注继续查看
一 介绍
  MySQL 5.6版本提供了很多性能优化的特性,其中之一是关于提高表join性能的算法 --- Batched Key Access (BKA) ,本文将结合之前写过MRR,BNL优化特性一起来详细介绍该算法。这篇文章是
我拖延时间最久的,之前一直没有搞清楚MRR,BKA之间的关联 ,BKA,BNL的区别,本周花了一天时间收集资料,算是搞懂了,里面有基于文档翻译的,可能不准确,请大家指正。

二 原理

  对于多表join语句,当MySQL使用索引访问第二个join表的时候,使用一个join buffer来收集第一个操作对象生成的相关列值。BKA构建好key后,批量传给引擎层做索引
查找。key是通过MRR接口
提交给引擎的. 这样,MRR使得查询更有效率。 

大致的过程如下:


1 BKA使用join buffer保存由join的第一个操作产生的符合条件的数据。
 
2 然后BKA算法构建key来访问被连接的表,并批量使用MRR接口提交keys到数据库存储引擎去查找查找。

3 提交keys之后,MRR使用最佳的方式来获取行并反馈给BKA . 

BKA使用join buffer size来确定buffer的大小,buffer越大,访问被join的表/内部表就越顺序。
MRR接口有2个应用场景:
场景1:应用于传统的基于磁盘的存储引擎(innodb,myisam),对于这些引擎join buffer中keys是一次性提交到MRR,MRR通过key找到rowid,通过rowid来获取数据
场景2:应用于远程存储引擎(NDB),来自join buffer上的部分key,从SQL NODE发送到DATA NODE,然后SQL NODE会收到通过相关关系匹配的行组合。然后使用这些行组合匹配出新行。然后在发送新
key,直到发完为止。


三 BNL和BKA,MRR的关系
  BNL和BKA都是批量的提交一部分结果集给下一个被join的表(标记为T),从而减少访问表T的次数,那么它们有什么区别呢?NBL和BKA的思想是类似的,详情见:《nest-loop-join官方手册》
 第一 NBL比BKA出现的早,BKA直到5.6才出现,而NBL至少在5.1里面就存在。
 第二 NBL主要用于当被join的表上无索引,Join buffering can be used when the join is of type ALL or index (in other words, when no possible keys can be used, and a full
scan is done, of either the data or index rows, respectively)

 第三 BKA主要是指在被join表上有索引可以利用,那么就在行提交给被join的表之前,对这些行按照索引字段进行排序,因此减少了随机IO,排序这才是两者最大的区别,但是如果被join的表没用
索引呢?那就使用NBL了。

 上面原理环境提到讲了在BKA实现的过程中就是通过传递keys给MRR接口,本质上还是在MRR里面实现,下面这幅图则展示了它们之间的关系:
 

四 如何使用
  要使用BKA,必须调整系统参数optimizer_switch的值,batched_key_access设置为on,因为BKA使用了MRR,因此也要打开MRR,但是基于成本优化MRR算法不是特别准确官方文档推荐关闭
mrr_cost_based,将其设置为off。


set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on' 

 另外多表join语句 ,被join的表/非驱动表必须索引可用。

五 参考资料
[1].Block Nested-Loop and Batched Key Access Joins
[3].Block-Based Join Algorithms
[4].Join Optimizations in MySQL 5.6 and MariaDB 5.5 
[5].bacthed-key-access-speeds-up-disk-bound 
[6].Multi Range Read Optimization 
[7].On the multi range read&batch key access&block nested loop


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
新飞行棋——动态规划
题目描述 期末考试终于结束了。Andy同学感觉松了一口气,他决定重温小时候的快乐时光–下飞行棋。 但是他弄丢了传统飞行棋需要的骰子,因此他发明了一种新型的飞行棋游戏,规则如下:棋盘上有n个格子,由近到远分别编号为1到n。对于1<=i<=n,第i个格子上写着一个正整数Ni。当玩家处于第a个格子时,他可以选择往后走Na步,或者往前倒退Na步。当然如果Na+a>n,那么他就只能选择后退;同理如果a-Na<1,那么他就只能选择前进。保证不会出现既不能前进又不能后退的格子。 Andy学完编程后对一个问题很感兴趣:从编号s出发,至少需要经过几把,可以到达t点?(例如在a点选择往前走Na步,称之为一把)。
36 0
200 行 TypeScript 代码实现一个高效缓存库 上
200 行 TypeScript 代码实现一个高效缓存库 上
39 0
200 行 TypeScript 代码实现一个高效缓存库 下
200 行 TypeScript 代码实现一个高效缓存库 下
40 0
TypeScript class 的访问控制
TypeScript class 的访问控制
40 0
动态规划问题-爬楼梯
动态规划的核心:我目前也说不清楚,知道动态规划可以解决很多问题。 爬楼梯: 假设你正在爬楼梯。需要 n 步你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。
821 0
Qt之QSS(动态属性)
简述 QSS可以定制应用程序的外观,无需关注Qt样式背后的魔力。从非常轻微到极其复杂的调整,样式表都可以做到。对于一个完全定制和独特的用户体验,QtQuick和QGraphicsView是更好的选择。 简述 自定义属性 限制 示例 效果 源码 QSS 更多参考 自定义属性 为了用户界面外观的动态变化,属性选择器可以与动态属性组合使用。动态属性
2187 0
ACCESS通过一个连接写入的数据,另一个连接却读取不出来
最近在用c#实现一个数据导入的功能,将一个ACCESS数据库中的数据导入到另一个ACCESS的数据库中,然后显示出来,但是导入成功了,却显示不出来。 经过研究觉得应该是缓存的原因,由于我写入数据和读取数据使用的不是一个OleDbConnection对象,而是分别打开了两个OleDbConnection连接对象;一个连接写入成功了,但保存到磁盘还需要点时间,所以这个连接写入成功,另一个连接立即去取就会有取不到的情况! 改为使用一个连接对象,问题就解决了。
611 0
+关注
640
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载