文档章节

Using MRR(Multi-Range Read )

秋风醉了
 秋风醉了
发布于 2015/08/23 04:05
字数 704
阅读 324
收藏 2
点赞 0
评论 0

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/

共有 人打赏支持
秋风醉了
粉丝 223
博文 581
码字总数 411013
作品 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 ⋅ 0

学习MYSQL之ICP、MRR、BKA

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

qhd2004 ⋅ 2016/11/09 ⋅ 0

【mysql】关于ICP、MRR、BKA等特性

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

踏雪无痕SS ⋅ 2017/04/18 ⋅ 0

MySQL MRR介绍

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

lirulei90 ⋅ 01/06 ⋅ 0

初步理解MySQL(5.6)的执行计划

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

Eumenidies ⋅ 2014/09/24 ⋅ 1

MySQL · 特性分析 · 优化器 MRR & BKA

上一篇文章咱们对 ICP 进行了一次全面的分析,本篇文章小编继续为大家分析优化器的另外两个选项: MRR & batchedkeyaccess(BKA) ,分析一下他们的作用、原理、相互关系、源码实现以及使用范围...

阿里云RDS-数据库内核组 ⋅ 2016/01/05 ⋅ 0

MariaDB10.1.22 Spider3.3腾讯补丁版分库分表下载

鉴于腾讯Tspider未开源,我拿到了原作者Kentoku Shiba的Spider3.3源代码(集成了腾讯的补丁,性能有所加强),并且编译到MariaDB 10.1.22 GA版本里,二进制下载地址 http://www.liyanlan.co...

hcymysql ⋅ 2017/05/03 ⋅ 0

hosts,resolv.conf的区别与联系

买了本自己一直期望的书《Linux系统架构与目录解析》,其实想要这样一本书很久了。虽然不是一个sa,但是也想对linux做到应用方面的熟练,而对linux整体把握,甚至细到有哪些目录,哪些文件,...

brucema ⋅ 2012/10/07 ⋅ 0

总结一下关于mysql 5.6 新特性

一直断断续续的看一些mysql特性,今天总结一下,以下是列表,网址 http://mariadb.org/ (也是类似的特性), http://mysql.com/ 最近在看关于mysql新特性的一些书 一. server参数默认值设置...

踏雪无痕SS ⋅ 2017/03/19 ⋅ 0

MySQL监控项一些指标

监控项 说明 ProblemMySQL Innodbpagescreated 在InnoDB表中创建的page数量.Innodbpagesread 从InnoDB buffer pool中读取的page数量.Innodbpageswritten 向InnoDB表中写入的page数量.Innodb......

知止内明 ⋅ 2017/12/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 16分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 18分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 29分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 30分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 33分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 34分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部