mysql数据库BKA算法详解

BKA算法是对NLJ算法的优化,通过一次性从驱动表获取多行数据存储在join_buffer中,提高join效率。当join_buffer不足以存放所有数据时,会分段执行流程。启用BKA算法需要设置SQL优化选项,依赖于MRR。
摘要由CSDN通过智能技术生成

BKA算法详解

Batched Key Access理解了 MRR 性能提升的原理,我们就能理解 MySQL 在 5.6 版本后开始引入的 BatchedKey Access(BKA) 算法了。这个 BKA 算法,其实就是对 NLJ 算法的优化。我们再来看看上一篇文章中用到的 NLJ 算法的流程图:

图 4 Index Nested-Loop Join 流程图NLJ 算法执行的逻辑是:从驱动表 t1,一行行地取出 a 的值,再到被驱动表 t2 去做join。也就是说,对于表 t2 来说,每次都是匹配一个值。这时,MRR 的优势就用不上了。那怎么才能一次性地多传些值给表 t2 呢?方法就是,从表 t1 里一次性地多拿些行出来,一起传给表 t2。既然如此,我们就把表 t1 的数据取出来一部分,先放到一个临时内存。这个临时内存不是别人,就是 join_buffer。通过上一篇文章,我们知道 join_buffer 在 BNL 算法里的作用,是暂存驱动表的数据。但是在 NLJ 算法里并没有用。那么,我们刚好就可以复用 join_buffer 到 BKA 算法中。如图 5 所示,是上面的 NLJ 算法优化后的 BKA 算法的流程。

图 5 Batched Key Access 流程图中,我在 join_buffer 中放入的数据是 P1~P100,表示的是只会取查询需要的字段。当然,如果 join buffer 放不下 P1~P100 的所有数据,就会把这 100 行数据分成多段执行上图的流程。那么,这个 BKA 算法到底要怎么启用呢?如果要使用 BKA 优化算法的话,你需要在执行 SQL 语句之前,先设置其中,前两个参数的作用是要启用 MRR。这么做的原因是,BKA 算法的优化要依赖于MRR。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值