MySQL中的MRR和BKA

MRR优化的目的就是减少磁盘的随机访问,InnoDB由于聚集索引的特性,如果查询使用辅助索引,并且用到表中非索引列,那么需要回表读取数据做后续处理,过于随机的回表会伴随大量的随机IO。

而MRR的优化并不是通过辅助索引读取到数据就回表,而是通过范围扫描将数据存入read_rnd_buffer_size,然后对其按照primary key(Row ID)排序,最后使用排序好的数据进行顺序回表,因为Innodb 中叶子节点数据是按照primary key(row ID)进行排列的,这样就转换随机IO为顺序IO了,对于瓶颈为IO的SQL查询语句将带来极大的性能提升。

BKA(Batched Key Access)结合MRR特性进行高效Join操作。
  1.将外循环表中相关列放入Join Buffer中。

  2.批量的将Key(索引键值)发送到MRR接口。

  3.MRR通过收到的key,根据其对应的primary key (row id )进行排序,然后再根据排序后的primary key(row id)顺序的读取聚集索引,得到需要的列数据。

  4.返回结果集给客户端。

 

posted @ 2020-08-08 11:41  别看窗外的世界  阅读(413)  评论(0编辑  收藏  举报