千家信息网

【MySQL】MySQL5.6新特性之Multi-Range Read

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,一 介绍MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为
千家信息网最后更新 2026年11月01日【MySQL】MySQL5.6新特性之Multi-Range Read一 介绍
MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO,提高查询效率。
二 原理
在没有MRR之前,或者没有开启MRR特性时,MySQL 针对基于辅助索引的查询策略是这样的:
  1. select non_key_column from tb wherekey_column=x;
MySQL 执行查询的伪代码
  1. 第一步 先根据where条件中的辅助索引获取辅助索引与主键的集合,结果集为rest。
  2. select key_column, pk_column from tb where key_column=x order by key_column
  3. 第二步 通过第一步获取的主键来获取对应的值。
  4. for each pk_column value in rest do:
  5. select non_key_column from tb where pk_column=val

由于MySQL存储数据的方式: 辅助索引的存储顺序并非与主键的顺序一致,从图中可以看出,根据辅助索引获取的主键来访问表中的数据会导致随机的IO . 不同主键不在同一个page 里面时必然导致多次IO 和随机读。

在使用MRR优化特性的情况下,MySQL 针对基于辅助索引的查询策略是这样的:
  1. 第一步 先根据where条件中的辅助索引获取辅助索引与主键的集合,结果集为rest
  2. select key_column, pk_column from tb where key_column = x order by key_column
  3. 第二步 将结果集rest放在buffer里面(read_rnd_buffer_size 大小直到buffer满了),然后对结果集rest按照pk_column排序,得到结果集是rest_sort
  4. 第三步 利用已经排序过的结果集,访问表中的数据,此时是顺序IO.
  5. select non_key_column fromtb where pk_column in ( rest_sort )

从图示MRR原理,MySQL 将根据辅助索引获取的结果集根据主键进行排序,将乱序化为有序,可以用主键顺序访问基表,将随机读转化为顺序读,多页数据记录可一次性读入或根据此次的主键范围分次读入,以减少IO操作,提高查询效率。

三 相关参数

我们可以通过参数 optimizer_switch 的标记来控制是否使用MRR,当设置mrr=on时,表示启用MRR优化。mrr_cost_based 表示是否通过 cost base的方式来启用MRR.如果选择mrr=on,mrr_cost_based=off,则表示总是开启MRR优化。
参数read_rnd_buffer_size 用来控制键值缓冲区的大小。

四 案例介绍
当开启MRR时

  1. MySQL > explain select * from tbl where tbl.key1 between 1000 and 2000;
  2. +----+-------------+-------+-------+---------------+------+---------+------+------+-------------------------------------------+
  3. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  4. +----+-------------+-------+-------+---------------+------+---------+------+------+-------------------------------------------+
  5. | 1 | SIMPLE | tbl | range | key1 | key1 | 5 | NULL | 960 | Using index condition; Using MRR |
  6. +----+-------------+-------+-------+---------------+------+---------+------+------+-------------------------------------------+
  7. 1 row in set (0.03 sec)
五 MRR的使用限
MRR 适用于以下两种情况。
1 range access
2 ref and eq_ref access, when they are using Batched Key Access

六 参考文章
《MariaDB Multi-Range Read Optimization》
《MySQL Multi-Range Read Optimization》
《Multi Range Read (MRR) in MySQL 5.6 and MariaDB 5.5》
索引 辅助 结果 顺序 查询 数据 特性 参数 排序 原理 大小 情况 效率 方式 条件 策略 范围 存储 控制 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 苏州找大状互联网科技有限公司 广州百单互联网科技有限公司 国智互联网科技 互联网科技巨头监管 科技和互联网公司 智能科技公司是互联网公司吗 腾讯科技 互联网女皇 深圳天众互联网科技公司 郑州华宇互联网科技 重庆科技学院互联网 中国互联网金融科技基金 顺网科技2021年互联网排名 以后互联网后是啥科技 玉溪互联网科技怎么选 中国科技创新与世界互联网大会 烟台灵鸽互联网科技有限公司 互联网时代科技型公司的机会 兰石爱特工业互联网科技分公司 盐城市攀科互联网科技有限公司 盈实互联网科技 互联网科技的 金融科技创新监管互联网金融 广州凡科互联网科技 撒么互联网科技公司 蓝色互联网科技 互联网金融科技公司干啥的 宇信科技在杭州互联网排第几 风投北京互联网科技 兰石爱特工业互联网科技分公司
0