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

转载 2015年07月09日 14:17:56
一 介绍
  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. 1 BKA使用join buffer保存由join的第一个操作产生的符合条件的数据。
  2. 2 然后BKA算法构建key来访问被连接的表,并批量使用MRR接口提交keys到数据库存储引擎去查找查找。
  3. 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。

  1. 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

相关文章推荐

mysql 5.6 新特性

  • 2015年03月04日 16:08
  • 1.12MB
  • 下载

mysql 5.6 新特性-innodb

  • 2016年01月22日 21:37
  • 740KB
  • 下载

MySQL 5.6同步复制新特性详解

 继5.5半同步复制后,MySQL 5.6又对其进行了优化与改进,其中有两个地方较为重要: 1、对运维人员来说应该是一件大喜的事情,在主从切换后,在传统的方式里,你需要找到binlog和POS...

MySQL5.6新特性之Index Condition Pushdown

一 概念介绍     Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。 a 当关闭ICP时,ind...
  • xtjsxtj
  • xtjsxtj
  • 2015年06月01日 11:32
  • 712

MySQL5.6新特性之GTID、多线程复制 - 不知为何

MySQL5.6新特性之GTID、多线程复制 - 不知为何MySQL5.6新特性GTID、多线程复制 在Oracle发布MySQL5.6看到众多新特性之后很兴奋,包括对复制的改进.在MySQL5....

MySQL 5.6的72个新特性(译)

MySQL 5.6的72个新特性(译) 一,安全提高 1.提供保存加密认证信息的方法,使用.mylogin.cnf文件。使用mysql_config_edi...

MySQL5.6 GTID新特性实践

MySQL5.6 GTID新特性实践本文将简单介绍基于MySQL5.6 GTID的主从复制原理的搭建。并通过几个实验介绍相关故障的处理方式。GTID简介什么是GTIDGTID(Global Trans...

MySQL之——5.6 GTID新特性实践

GTID简介 什么是GTID GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID实际上是由UUID+TID组成的。其中UUID是一...

MySQL5.6新特性之crash-safe

转自:http://www.linuxidc.com/Linux/2015-08/121130.htm 一 介绍 MySQL 5.6 针对复制功能提供了新特性: slave支持crash-safe...
  • wuai4
  • wuai4
  • 2015年09月14日 11:11
  • 103

mysql5.6新特性总结

mysql5.6版本改变了不少,总结如下所示: 一. server参数默认值设置的变化 http://dev.mysql.com/doc/refman/5.6/en/server-default-...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【MySQL】MySQL5.6新特性之Batched Key Access
举报原因:
原因补充:

(最多只允许输入30个字)