文档章节

Using MRR(Multi-Range Read )

秋风醉了
 秋风醉了
发布于 2015/08/23 04:05
字数 704
阅读 329
收藏 2

Using MRR(Multi-Range Read )

MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO,提高查询效率。

Multi-Range Read原理 

在没有MRR之前,或者没有开启MRR特性时,MySQL针对基于辅助索引的查询策略是这样的:

select non_key_column from tb where key_column=x;

第一步 先根据where条件中的辅助索引获取辅助索引与主键的集合,结果集为rest。

select key_column, pk_column from tb where key_column=x order by key_column

第二步 通过第一步获取的主键来获取对应的值。

for each pk_column value in rest do:
       select non_key_column from tb where pk_column=val

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

在使用MRR优化特性的情况下,MySQL针对基于辅助索引的查询策略是这样的:

第一步 先根据where条件中的辅助索引获取辅助索引与主键的集合,结果集为rest

select key_column, pk_column from tb where key_column = x order by key_column

第二步 将结果集rest放在buffer里面(read_rnd_buffer_size 大小直到buffer满了),然后对结果集rest按照pk_column排序,得到结果集是rest_sort

第三步 利用已经排序过的结果集,访问表中的数据,此时是顺序IO. 

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. range access

  2. ref and eq_ref access, when they are using Batched Key Access

如下示例,

在totalView列上建立索引,

alter table article add index idx_total_view (totalView);

alter table article drop index idx_total_view;

> explain select * from article where totalView between 20 and 8987

******************** 1. row *********************
           id: 1
  select_type: SIMPLE
        table: article
         type: range
possible_keys: idx_total_view
          key: idx_total_view
      key_len: 5
          ref: 
         rows: 1
        Extra: Using index condition; Using MRR
1 rows in set

========END========

本文转载自:http://blog.itpub.net/22664653/viewspace-1673682/

共有 人打赏支持
秋风醉了
粉丝 232
博文 575
码字总数 406007
作品 0
朝阳
程序员
浅析multi range read(MRR) & batch key access(BKA) & block nested loop(BNL)

另一篇文章介绍了index condition pushdown(ICP) 这篇讲叙的是MRR和与之相关的BKA 什么是MRR? MRR:multi range read。不好解释,先来看个例子: select * from tb where key_column = x 在...

长平狐
2012/11/01
149
0
【mysql】关于ICP、MRR、BKA等特性

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

踏雪无痕SS
2017/04/18
0
0
学习MYSQL之ICP、MRR、BKA

Index Condition Pushdown(ICP) Index Condition Pushdown (ICP)是MySQL使用索引从表中检索行数据的一种优化方式。 ICP原理 禁用ICP,存储引擎会通过遍历索引定位基表中的行,然后返回给MyS...

qhd2004
06/29
0
0
MySQL MRR介绍

这个文章的原始出处找不到了。 什么是MRR? MRR:multi range read。不好解释,先来看个例子: select * from tb where key_column = x 在没有MRR的情况下,它是这样得到结果的: 1. select ...

lirulei90
01/06
0
0
初步理解MySQL(5.6)的执行计划

声明:以下均来自于MySQL英文手册5.6,本文主要针对执行计划,由于本人才疏学浅,其他部分可能会一句话带过。 引言.什么是执行计划: The set of operations that the optimizer chooses to ...

Eumenidies
2014/09/24
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

文件的压缩与解压(linux)

Linux下*.tar.gz文件解压缩命令 1.压缩命令:   命令格式:tar -zcvf 压缩后文件名.tar.gz 被压缩文件名 可先切换到当前目录下。压缩文件名和被压缩文件名都可加入路径。 2.解压缩命令: ...

qimh
33分钟前
3
0
invalid character found in the request target 异常

这个异常时因为Tomcat 9不支持请求格式出现“{”等非法字符的问题 因为tomcat版本问题遇到的坑,记录一下。 问题 今天由于要测试一下订单详情页的异步查询,在本地起了一个服务,发送的请求是...

edwardGe
37分钟前
4
0
发现抓包软件fiddler的bug

1个请求他跳转之后,直接400,被拦在了Apache,使用fiddler 的,replay requests 是同样的结果,但是replay composer确是正常的。 也就是说这replay requests 是发原来的包,replay composer...

NLGBZJ
47分钟前
1
0
linux screen 命令详解

shell关闭后, 主机仍然运行 screen命令 启动jenkins以后, screen, 然后按ctrl+a 再按d 这样暂停了子界面, 这时候回到了父界面 用screen –ls查看目前子界面的状态 [root@free /]# screen -l...

SuShine
48分钟前
4
0
mac机器切换无线网络导致网页不能打开的问题

问题: 公司和家里使用不同的WI-FI,每次从家到公司时自动切换网络后,公司的许多地址不能访问, ping域名是可以ping同的,但是网页却打不开... 问题分析: 初步猜想是DNS缓存的问题? 对于MAC系统没...

Lennie002
51分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部