转载于: 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 optimizer mrr_mysql mrr介绍相关推荐

  1. mysql开启mrr_MySQL MRR介绍

    这个文章的原始出处找不到了. 什么是MRR? MRR:multi range read.不好解释,先来看个例子: select * from tb where key_column = x 在没有MR ...

  2. mysql optimizer mrr_mysql 索引优化特性之MRR

    MRR针对于辅助索引上的范围查询进行优化,收集辅助索引对应主键rowid.进行排序后回表查询,随机IO转顺序IO 当我们需要对大表(基于辅助索引)进行范围扫描时,会导致产生许多随机/O.而对于普通磁盘 ...

  3. mysql optimizer mrr_MySQL优化器功能开关optimizer_switch

    MySQL 8.0新增特性 use_invisible_indexes:是否使用不可见索引,MySQL 8.0新增可以创建invisible索引,这一开关控制优化器是否使用invisible索引,on ...

  4. mysql optimizer mrr_[转] MySQL 的 MRR 到底是什么?

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

  5. MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;

    一. MySQL 中的执行计划 1 MySQL 执行计划 在 MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL 是 如何处理 SQL 语句的. 2 M ...

  6. MySQL Cluster 群集安装环境介绍

    MySQL Cluster 群集安装环境介绍 MySQL 群集支持的操作系统: * Linux (Red Hat, Novell/SUSE) * Sun Solaris * IBM AIX * HP- ...

  7. mysql optimizer组件_MySQL Optimizer

    最后更新:2018-10-09 当前版本:1.9.1 应用大小:8.8 MB 应用语言:英文 系统要求:OS X 10.11 或更高 应用描述: MySQL和MariaDB优化工具 MySQL Opt ...

  8. Mysql数据库的简单介绍

    在当今的大数据时代,数据库已成为必不可少的数据工具.什么是数据库呢,数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. MYSQL是目前最为流行的关系型数据库系统,关系型数据库系统 ...

  9. [转载]MySQL exists的用法介绍

    原文摘自:http://www.cnblogs.com/glory-jzx/archive/2012/07/19/2599215.html MySQL exists的用法介绍 有一个查询如下: 1 S ...

最新文章

  1. 推出应用加速器 伟库网为用户应用体验上保险
  2. Netflow/IPFIX 流量收集与分析
  3. Codeforces Round #171 (Div. 2)
  4. 【工具】音乐播放相关工具,音乐文件格式转换工具,MP3文件转换成arduino可以直接播放的wav格式,MP3转WAV工具...
  5. 古诗-豪放派和婉约派
  6. 如何设计一个合适的系统电源
  7. 这是什么操作?java中的变量竟然可以先使用后声明?
  8. NQueens, NQueens2 N皇后问题,递归回溯
  9. 【编程题目】给你 10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数...
  10. 2D转换之旋转rotate(CSS3)
  11. 每天CookBook之JavaScript-073
  12. [亲测]Oracle数据库约束
  13. c语言 十进制转换成二进制 递归实现
  14. 2.1Mysql 基础--基本介绍
  15. Worthington胰蛋白酶解决方案
  16. SOP SO SOIC TSSOP SSOP 封装直观比较图 [转载]
  17. javascript--经典实例锦集
  18. HPM6750EVK 硬件通读与例程通跑 1
  19. isInterrupted() interrupt() interrupted() 方法的简单解释
  20. 高数-(01)函数与极限

热门文章

  1. 利用Vitis开发基于ZCU106的神经网络加速器(一)——Vitis概述及XRT编译
  2. JavaSE第一阶段知识概括
  3. uno arduino_医用呼吸机+ STONE LCD + Arduino UNO
  4. template模板的写法
  5. PLC电机服务器原理,各种用途电机PLC控制原理图、二次接线图
  6. 用Go构建区块链——4.交易1
  7. 开发环境解决跨域问题
  8. Java编译过程、JIT编译详解、类加载过程
  9. NMRV系统蜗轮蜗杆减速机使用与保养文章
  10. 512卡农头接线序号