mysql联接查询算法之Batchedkeyaccess(BKA)四
Batched key access (BKA)
BKA算法集结了 INLJ、BNLJ、MRR 算法的特性。它⽤到了INLJ的内部表索引减少关联匹配的次数;⼜使⽤到了BNLJ 的join buffer,⽤以暂存外表连接数据减少访问内部表;还⽤到了MRR的收集主键rowid后排序再回表查询,随机IO转顺序IO;可以把BKA看做是INLJ算法的加强版!
我们知道INLJ使⽤内部表索引进⾏关联能够⼤幅提升查询效率,但是当查询中涉及到其它字段时需要回表查询。通过辅助索引进⾏联接后需要回表,这⾥需要⼤量的随机I/O操作。若能优化随机I/O,那么就能极⼤的提升Join的性能。为此,MySQL 5.6(MariaDB 5.3)开始⽀持Batched Key Access Join算法(简称BKA),该算法通过常见的空间换时间,随机I/O转顺序I/O,以此来极⼤的提升Join的性能。
理解了 MRR 性能提升的原理,我们就能理解 MySQL 在 5.6 版本后开始引⼊的 Batched Key Acess(BKA) 算法了。我们知道 INLJ 算法执⾏的逻辑是:从驱动表⼀⾏⾏地取出 join 条件值,再到被驱动表去做 join。也就是说,对于被驱动表来说,每次都是匹配⼀个值。这时,MRR 的优势就⽤不上了。那怎么才能⼀次性地多传些值给被驱动表呢?⽅法就是,从驱动表⾥⼀次性地多拿些⾏出来,⼀起传给被驱动表。既然如此,我们就把驱动表的数据取出来⼀部分,先放到⼀个临时内存。这个临时内存不是别⼈,就是 join_buffer。
我们知道 join_buffer 在 BNL 算法⾥的作⽤,是暂存驱动表的数据。但是在 NLJ 算法⾥并没有⽤。那么,我们刚好就可以复⽤ join_buffer 到BKA 算法中。NLJ 算法优化后的 BKA 算法的流程,整个过程如下所⽰:
MySQL联接查询算法(NLJ、BNL、BKA、HashJoin)
外表-->外表join buffer --> 内表index-->收集主键进⾏排序(mrr)--> 内表
对于多表join语句,当MySQL使⽤索引访问第⼆个join表的时候,使⽤⼀个join buffer来收集第⼀个操作对象⽣成的相关列值。BKA构建好key 后,批量传给引擎层做索引查。key是通过MRR接⼝提交给引擎的,这样,MRR使得查询更有效率。
如果外部表扫描的是主键,那么表中的记录访问都是⽐较有序的,但是如果联接的列是⾮主键索引,那么对于表中记录的访问可能就是⾮常离散的。因此对于⾮主键索引的联接,Batched Key Access Join算法将能极⼤提⾼SQL的执⾏效率。BKA算法⽀持内联接,外联接和半联接操作,包括嵌套外联接。
access转mysql教程视频Batched Key Access Join算法的⼯作步骤如下:
1、 将外部表中相关的列放⼊Join Buffer中。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。