这个文章的原始出处找不到了。

什么是MRR?

MRR:multi range read。不好解释,先来看个例子:

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_MySQL MRR介绍相关推荐

  1. mysql optimizer mrr_mysql mrr介绍

    转载于: https://blog.51cto.com/lee90/2058185 什么是MRR? MRR:multi range read. 本质: MRR 在本质上是一种用空间换时间的算法 不好解 ...

  2. mysql开启mrr_mysql 之 MRR

    Multi-Range Read (MRR) MRR 的全称是 Multi-Range Read Optimization,是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手 ...

  3. 简单介绍MySQL开启事务的两种方式

    本篇文章给大家分享MySQL 是如何开启一个事务的,原文通过两种方式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧 方式 1 START TRANSACTION 或 ...

  4. mysql using mrr_MySQL 的 MRR 到底是什么?

    MRR,全称「Multi-Range Read Optimization」. 简单说:MRR 通过把「随机磁盘读」,转化为「顺序磁盘读」,从而提高了索引查询的性能. 至于: 为什么要把随机读转化为顺序 ...

  5. mysql using mrr_MySQL InnoDB MRR优化指南

    前言 MRR 是 Multi-Range Read 的简写,目的是减少磁盘随机访问,将随机访问转化为较为顺序的访问.适用于 range/ref/eq_ref 类型的查询. 实现原理: 1.在二级索引查 ...

  6. 诛仙mysql怎么开战场_战场介绍:诛仙2普通战场开启条件及介绍

    导语:本文为你介绍诛仙2普通战场开启条件及介绍 普通战场是未飞升的玩家可以参与的战场.在战场中玩家可以获得大量的经验和各种战场奖励. ●战场开启 战场的开启需要全服务器成员的努力.只有服务器内成员的等 ...

  7. mysql geo_地理位置geo处理之mysql函数的详细介绍(附代码)

    本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...

  8. mysql mrr_cost_based_【MRR】转-MySQL 的 MRR 优化

    MRR,全称「Multi-Range Read Optimization」. 简单说:MRR 通过把「随机磁盘读」,转化为「顺序磁盘读」,从而提高了索引查询的性能. 至于: 为什么要把随机读转化为顺序 ...

  9. linux mysql开远程访问,Linux mysql开启远程访问

    默认情况下远程访问会出现 Can't connect to MySQL server on '192.168.10.18′ (10061) 错误 是因为,mysql的默认配置为了增强安全性,禁止了非本 ...

最新文章

  1. c++ vscode 第三方库_Windows平台配置VSCode的C/C++环境,超清晰
  2. 常用的webservice接口
  3. Exchange Server 2010 灾难恢复
  4. 零基础学编程学java还是python-小白学编程选java、php、前端还是python
  5. 骚操作!用铁丝做“电路”,不服不行!
  6. vue中mixin 感觉很牛逼(父子组件融合成一个新组件)
  7. mysql增加sort_buffer_设置sort_buffer_size
  8. python 保存文件 吃内存_孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化...
  9. 瓦片地图与geoserver发布
  10. 【ACL2021】BERT也能做生成?利用多个BERT模型分离对话生成和对话理解
  11. EMNLP 2018 | 为什么使用自注意力机制?
  12. [RTOS]uCOS、FreeRTOS、RTThread、RTX等RTOS的对比之特点
  13. 架构师到底该不该写代码?
  14. php微信聊天带语音,使用Html5多媒体实现微信语音功能
  15. 超级简单的私有云笔记+私有云网盘
  16. 小程序 | 小程序中常用的事件 + 事件对象的属性列表 +小程序事件传参 + 小程序全局配置 + 小程序页面配置 + 小程序发起网络数据请求
  17. JavaWeb技术内幕八:JVM内存管理
  18. 小学计算机课优质课,2018年武汉市小学信息技术优质课评比
  19. 推荐一款MySQL开源客户端,免费+跨平台+使用便捷
  20. [python小工具]随机调用一个浏览器打开网页

热门文章

  1. “智能、微型、多功能”将引领智能手表传感器新趋势
  2. 办公室计算机知识如何提高,办公电脑常用技巧 办公室电脑有哪些常用技巧
  3. 7-97 计算个人所得税
  4. 面经4:顺丰科技:22年实习生大数据开发面试
  5. 完美解决在Latex的表格里的单元格内的文本紧贴着上边框线条的问题
  6. 数字中国建设整体布局规划解读
  7. 【Fabric2.2.1搭建】过程及遇到的问题
  8. java操作word,添加页眉,页眉图片,替换书签,添加水印(全)
  9. 如何使用anaconda创建环境
  10. 数据库分解-含孤立属性的三范式无损连接保持依赖分解——以S-T表为例