一、什么是MRR

MMR全称是Multi-Range Read,是MYSQL5.6优化器的一个新特性,在MariaDB5.5也有这个特性。优化的功能在使用二级索引做范围扫描的过程中减少磁盘随机IO和减少主键索引的访问次数。将随机IO转换为顺序IO

二、MRR和没有MRR的区别

给出一个简单的例子,在innodb表执行下面的查询:

SELECT non_key_column FROM tbl WHERE key_column=x

在没有MRR的情况下,它是这样得到结果的:

1.  select key_column, pk_column from tb where key_column=x order  by key_column ---> 假设这个结果集是t

2.  for each row in t ;   select non_key_column from tb where pk_column = pk_column_value。(在oracle里第2步叫回表)

在有MRR的情况下,它是这样执行的:

1.  select key_column, pk_column from tb where key_column = x  order by key_column ---> 假设这个结果集是t

2.  将结果集t放在buffer里面(直到buffer满了),然后对结果集t按照pk_column排序      ---> 假设排序好的结果集是t_sort

3.  select non_key_column fromtb where pk_column in (select pk_column from t_sort)

两者的区别主要是两点:

1. 没有MRR的情况下,随机IO增加,因为从二级索引里面得到的索引元组是有序,但是他们在主键索引里面却是无序的,所以每次去主键索引里面得到non_key_column的时候都是随机IO。(如果索引覆盖,那也就没必要利用MRR的特性了,直接从索引里面得到所有数据)

2. 没有MRR的情况下,访问主键索引的次数增加。没有MRR的情况下,二级索引里面得到多少行,那么就要去访问多少次主键索引(也不能完全这样说,因为mysql实现了BNL),而有了MRR的时候,次数就大约减少为之前次数t/buffer_size。

二 BKA

Batched Key Access (BKA)  提高表join性能的算法。当被join的表能够使用索引时,就先排好顺序,然后再去检索被join的表,听起来和MRR类似,实际上MRR也可以想象成二级索引和 primary key的join

如果被Join的表上没有索引,则使用老版本的BNL策略(BLOCK Nested-loop)

BKA原理

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

大致的过程如下:

BKA使用join buffer保存由join的第一个操作产生的符合条件的数据

然后BKA算法构建key来访问被连接的表,并批量使用MRR接口提交keys到数据库存储引擎去查找查找。

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

BNL和BKA都是批量的提交一部分行给被join的表,从而减少访问的次数,那么它们有什么区别呢?

BNL比BKA出现的早,BKA直到5.6才出现,而NBL至少在5.1里面就存在。

BNL主要用于当被join的表上无索引

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

BKA和BNL标识

Using join buffer (Batched Key Access)和Using join buffer (Block Nested Loop)

相关参数

BAK使用了MRR,要想使用BAK必须打开MRR功能,而MRR基于mrr_cost_based的成本估算并不能保证总是使用MRR,官方推荐设置mrr_cost_based=off来总是开启MRR功能。打开BAK功能(BAK默认OFF):

SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

复制代码

BKA使用join buffer size来确定buffer的大小,buffer越大,访问被join的表/内部表就越顺序。

BNL默认是开启的,设置BNL相关参数:

SET optimizer_switch=’block_nested_loop’

复制代码

支持inner join, outer join, semi-join operations,including nested outer joins

BKA主要适用于join的表上有索引可利用,无索引只能使用BNL

三  设置

SET global optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

mysql5.7bka_mysql 5.7中的MRR和BKA算法相关推荐

  1. mysql5.6 icp mrr bak_【mysql】关于ICP、MRR、BKA等特性

    Index Condition Pushdown (ICP)是mysql使用索引从表中检索行数据的一种优化方式,从mysql5.6开始支持,mysql5.6之前,存储引擎会通过遍历索引定位基表中的行, ...

  2. mysql mrr icp_【mysql】关于ICP、MRR、BKA等特性

    一.Index Condition Pushdown(ICP) Index Condition Pushdown (ICP)是mysql使用索引从表中检索行数据的一种优化方式,从mysql5.6开始支 ...

  3. 美团公开外卖配送中的“预估到达时间”算法规则

    9 月 10 日,美团称于近日收到了市场监管总局等部门关于算法的指导意见,邀请了不同相关方一起探讨配送时间的计算规则--通过骑手恳谈会收集意见,邀请外部专家学者讨论算法的调整方向和细节,并在部分城市进 ...

  4. 基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。

    基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明. 基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明. 西北工业大学编译原理课件第八章 代码优化.p ...

  5. 工具类:关于如何找到两个List数组中不同的数据的算法!

    找到两个List数组中不同的数据的算法! import java.util.ArrayList; import java.util.HashMap; import java.util.List; im ...

  6. ML之回归预测:机器学习中的各种Regression回归算法、关键步骤配图

    ML之回归预测:机器学习中的各种Regression回归算法.关键步骤配图 目录 机器学习中的各种回归算法 1.回归算法代码 2.各种回归算法 3.各种回归算法大PK 机器学习中的各种回归算法 1.回 ...

  7. [BS-28] iOS中分页的几种算法

    iOS中分页的几种算法 总记录数:totalRecord 每页最大记录数:maxResult 算法一: totalPage = totalRecord % maxResult == 0 ? total ...

  8. JavaScript实现返回数字的二进制表示中使用的位数bitLength算法(附完整源码)

    JavaScript实现返回数字的二进制表示中使用的位数bitLength算法(附完整源码) bitLength.js完整源代码 bitLength.js完整源代码 export default fu ...

  9. C语言从未排序的链接列表中删除重复项的算法(附完整源码)

    C语言从未排序的链接列表中删除重复项的算法 C语言从未排序的链接列表中删除重复项的算法完整源码(定义,实现,main函数测试) C语言从未排序的链接列表中删除重复项的算法完整源码(定义,实现,main ...

  10. C语言用‘%20‘替换字符串中的所有空格的算法(附完整源码)

    C语言用'%20'替换字符串中的所有空格的算法 C语言用'%20'替换字符串中的所有空格的算法完整源码(定义,实现,main函数测试) C语言用'%20'替换字符串中的所有空格的算法完整源码(定义,实 ...

最新文章

  1. IC基础知识(4)电源管理简介:稳压器IC
  2. 计算机网络怎么删除,怎么删除网络协议
  3. 海量数据处理 - 10亿个数中找出最大的10000个数(top K)
  4. Pycharm 2018安装步骤详解
  5. LeetCode 319. 灯泡开关(找规律)
  6. java编译源文件_Java实现编译源文件(Java源码)
  7. mysql源码安装报错_mysql 的二进制和源码包 安装的报错总结
  8. Java插件自动保存浏览器书签_多浏览器书签同步插件EverSync
  9. 抖音回应李小璐PGone视频曝光:草稿视频不会上传到后台
  10. python中角度怎么表示_python – 如何知道两点之间的角度?
  11. 用python写一个除法的函数_2、Python基础--除法、常用数学函数
  12. Zuul 代理文件上传、为路由提供 hystrix 回退、过滤器、超时时间
  13. 数据源为XML的GridView操作
  14. 【JAVA】第十一届蓝桥杯省模拟赛答案(高职专科组)
  15. HTML-特效代码大全
  16. Flask 使用abort方法返回http错误码、http错误响应信息
  17. 微信小程序 生成跳转体验版url,可直接跳转到体验版小程序(可通过此方法测试模板消息)
  18. 怎样截屏计算机桌面,如何快速截图? 电脑桌面截图快捷键是哪个【详细介绍】...
  19. 十二烷基-β-D-麦芽糖苷/CAS号: 69227-93-6
  20. 初识自定义View-View的弹性滑动

热门文章

  1. mysql复制(高可用架构方案的基础)
  2. HttpClient模拟客户端请求实例
  3. 时刻牢记“我是谁、为了谁、依靠谁” 始终践行党的群众观点和群众路线
  4. 什么是字节 什么是数据包
  5. java日期去掉时分秒,只保留年月日
  6. Java十进制数和二进制数之间的相互转换
  7. 修改centos7的MAC地址
  8. 一张图看懂阿里云智能媒体管理产品 1
  9. linux 编译程序的四个过程
  10. linux常用命令示例