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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 一 介绍     MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO,提高查询效率。
一 介绍
    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》 
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
923.【mysql】 only full group by 模式
923.【mysql】 only full group by 模式
20 1
|
6月前
|
存储 关系型数据库 MySQL
深入浅出MySQL MRR(Multi-Range Read)
在探索数据库优化的广阔领域中,我们不可避免地会遇到一系列独特的概念和技术。其中之一就是MySQL的多范围读取(Multi-Range Read, MRR)
100 0
深入浅出MySQL MRR(Multi-Range Read)
|
存储 缓存 关系型数据库
【MySQL】query_cache_size=16M,是干什么的?底层原理是什么?
【MySQL】query_cache_size=16M,是干什么的?底层原理是什么?
117 0
|
SQL 关系型数据库 MySQL
MySQL - IS NOT NULL 和 != NULL 的区别?
MySQL - IS NOT NULL 和 != NULL 的区别?
511 0
|
存储 SQL 缓存
PolarDB-MySQL 新特性 - Partial Result Cache
背景查询缓存(Query Cache)是数据库执行层的一个加速查询的特性,用来缓存一条查询语句的结果集,如果后续再有相同的查询,直接从结果集缓存中读取结果,而不用再重新执行而极大提升查询性能。但Query Cache在实际业务使用中存在较多的局限性,首先能够命中Query Cache的规则非常严格,必须是完全相同的SQL语句,并且被查询的表的数据不能有任何的修改,有任意规则不符合要求都会造成cac
164 0
PolarDB-MySQL 新特性 - Partial Result Cache
|
SQL 关系型数据库 MySQL
MySQL中的only_full_group_by模式
对于 GROUP BY 聚合操作,如果在 SELECT 中的列,没有在 GROUP BY 中出现,那么这个 SQL 是不合法的,因为列不在 GROUP BY 句中,所以对于设置了这个 mode 的数据库,在使用 GROUP BY 的时候,就要用 MAX(),SUM(),ANT_VALUE() 这种聚合函数,才能完成 GROUP BY 的聚合操作。
153 0
|
关系型数据库 MySQL
MySQL - COUNT(NULL)
MySQL - COUNT(NULL)
96 0
|
存储 关系型数据库 MySQL
mysql中FIND_IN_SET和like的区别
在数据库中新建一张测试表t_user,包含三个字段'id','name','grilfriend',字段很容易看出,这是记录一个人的女朋友的表,注意这里的‘firlfriend’字段可以是多个人名,之间用逗号分开,如‘杨幂01,杨幂02’;这样的数据存储我们也经常见到。
213 0
mysql中FIND_IN_SET和like的区别
|
SQL 前端开发 关系型数据库
MYSQL 中 LIMIT 用法
MYSQL 中 LIMIT 用法
153 0
MYSQL 中 LIMIT 用法
|
存储 JSON 数据格式
MySQL8.0.17 - Multi-Valued Indexes 简述
本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支持 (感觉官方未来一定会推出类似pg的array 列类型), 并基于array来构建二级索引,这意味着该二级索引的记录数可以是多于聚集索引记录数的,因而该索引不可以用于通常意义的查询,只能通过特定的接口函数来使用,下面的例子里会说明。
1728 0