Home  >  Article  >  Database  >  MySQL5.6新特性之Multi-Range Read

MySQL5.6新特性之Multi-Range Read

WBOY
WBOYOriginal
2016-06-07 15:53:24879browse

MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询

一 介绍
    MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO,提高查询效率。
二 原理
 在没有MRR之前,或者没有开启MRR特性时,MySQL 针对基于辅助索引的查询策略是这样的:

select non_key_column from tb wherekey_column=x;
MySQL 执行查询的伪代码

第一步 先根据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

MySQL5.6新特性之Multi-Range Read

由于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 )

MySQL5.6新特性之Multi-Range Read

从图示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时


MySQL > explain select * from tbl where tbl.key1 between 1000 and 2000;
 
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------------------------------------+

| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                                    |

+----+-------------+-------+-------+---------------+------+---------+------+------+-------------------------------------------+

| 1  | SIMPLE      | tbl  | range | key1          | key1 | 5      | NULL | 960  | Using index condition; Using MRR          |

+----+-------------+-------+-------+---------------+------+---------+------+------+-------------------------------------------+

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

本文永久更新链接地址

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn