转载于: https://blog.51cto.com/lee90/2058185

什么是MRR?

MRR:multi range read。

本质: MRR 在本质上是一种用空间换时间的算法

不好解释,先来看个例子:

select * from tb 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。

所以说MRR主要解决的就是这两个问题。

此外,MRR还可以将某些范围查询,拆分为键值对,以此来进行批量的数据查询。这样做的好处是可以在拆分过程中,直接过滤一些不符合查询条件的数据。

如:

官方文档:https://dev.mysql.com/doc/refman/5.7/en/mrr-optimization.html

> SELECT * FROM t WHERE key_part1 >=1000 AND key_part1 < 2000 AND key_part2 = 1000;

表t有(key_part1,key_part2)的联合索引,因此索引根据key_part1,key_part2的位置关系进行排序。若没有MRR,此时查询类型为Range,SQL优化器会先将key_part1大于1000且小于2000的数据都取出来,即便key_part2不等于1000。取出后再根据key_part2的条件进行过滤。这会导致无用的数据被取出。

如果启用MRR优化器会使性能有巨大的提升,优化器会先将查询条件拆分为(1000,1000),(1001,1000),(1002,1000)....(1999,1000) 最后再根据这些拆分出的条件进行数据的查询。

是否启用MRR优化,可以通过参数optimizer_switch中的flag来控制。当MRR为on时,表示启用MRR优化。mrr_cost_based表示是否通过costbased的方式来选择是否启用mrr。若设置mrr=on,mrr_cost_based=off,则总是启用MRR优化。如下:

> SET GLOBAL optimizer_switch='mrr=on,mrr_cost_based=off';

参数read_rnd_buffer_size用来控制键值的缓冲区大小。当大于该值时,则执行器对已经缓存的数据根据RowID进行排序,并通过RowID来取得行数据,该值默认是256KB

>show VARIABLES like 'read_rnd_buffer_size';

+----------------------+---------+

| Variable_name        |   Value |

|----------------------+---------|

| read_rnd_buffer_size |  262144 |

+----------------------+---------+

mysql mrr_cost_based_mysql mrr介绍相关推荐

  1. mysql数据库引擎介绍

    mysql数据库引擎介绍 你能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HE ...

  2. LAMP架构介绍、MySQL和MariaDB介绍、MySQL安装

    2019独角兽企业重金招聘Python工程师标准>>> LAMP架构介绍 Linux+Apache+MySQL+PHP 就是在linux系统上安装httpd. mysql .PHP, ...

  3. mysql 查询日志介绍

    MySQL查询日志介绍 MySQL的查询日志记录了所有MySQL数据库请求的信息.无论这些请求是否得到了正确的执行.默认文件名为hostname.log.默认情况下MySQL查询日志是关闭的.生产环境 ...

  4. MySQL复制类型介绍

    MySQL复制类型介绍: (1)同步复制:MASTER提交事务,直到事务在所有的Slave都已提交,此时,才会返回给客户端,事务执行完毕. 缺点:完成一个事务可能会有很大的延迟. slave1 MAs ...

  5. MySQL查询日志介绍

    MySQL查询日志介绍 MySQL的查询日志记录了所有MySQL数据库请求的信息.无论这些请求是否得到了正确的执行.默认文件名为hostname.log.默认情况下MySQL查询日志是关闭的.生产环境 ...

  6. MySQL第7天:MySQL的架构介绍之存储引擎

    MySQL的架构介绍之存储引擎 #编写时间:2017.3.9 #编写地点:广州 1.存储引擎相关的命令 //查看已安装的mysql已提供的存储引擎 mysql>show engines;//查看 ...

  7. MySQL第6天:MySQL的架构介绍之逻辑架构

    MySQL的架构介绍之逻辑架构 #编写时间:2017.3.7 #编写地点:广州 MySQL的优势主要体现在存储引擎的架构上,它是插件式的存储引擎架构,将查询处理和其它的系统任务以及数据的存储提取分离, ...

  8. MySQL第4天:MySQL的架构介绍之修改数据库编码格式

    MySQL的架构介绍之修改数据库编码格式 1.配置文件介绍 #编写时间:2017.3.6 #编写地点:广州 上一篇文章可知mysql的配置文件在:/usr/share/mysql,其中/usr/sha ...

  9. MySQL第3天:MySQL的架构介绍之linux版安装

    MySQL的架构介绍之linux版安装 #编写时间:2017.3.5 #编写地点:广州 mysql linux版安装 1.源码安装(本节不提) 2.rpm安装 (1)下载地址:https://dev. ...

最新文章

  1. virt-manager 的桥接网络配置问题
  2. Saying Good-bye to Cambridge Again --by Xu Zhimo
  3. php.ini 302,302使用nginx和WordPress重定向循环
  4. 从零开始搭二维激光SLAM --- 总结
  5. VRay高级材质素材分享,精选,热门
  6. JsonView 使用方法
  7. BMFont制作字体图集
  8. 中文免费电子书网站合集收藏
  9. 如何理解范德波尔方程
  10. FileZilla的下载与安装
  11. 神州优车黄强元:上云之路“一波三折”,为何最终选择阿里云?
  12. 和孩子读书学习的一点心得
  13. 高通挥刀 | 一点财经
  14. 一、ArcGIS Server篇:利用ArcGIS Server发布动态地图服务
  15. 微信小程序 之 mpvue
  16. JavaScript知识点 总结二:
  17. SAP ABAP 根据采购订单(PO)创建交货单(DN) BAPI_DELIVERYPROCESSING_EXEC - 创建内向交货单
  18. 安卓开发——微信UI界面
  19. Echarts 3D立体柱状图(源码+例图)
  20. 获取IE和Gecko内核的浏览器的网页内容的demo

热门文章

  1. latex常见编译错误和细节
  2. python moviepy 特效编辑
  3. (最简单)小米MIX 2S的usb调试模式在哪里开启的流程
  4. 迭代器与生成器yield
  5. 【数据架构解读】基于阿里云数加StreamCompute和MaxCompute构建的访问日志统计分析...
  6. nagios监控linux nrpe安装
  7. We7 从这里开始---安装we7
  8. python从入门到实践回顾——字典
  9. 解决“cannot open git-receive-pack”错误
  10. AFNetworking 取消请求