mysql optimizer mrr_mysql mrr介绍
转载于: https://blog.51cto.com/lee90/2058185
什么是MRR?
MRR:multi range read。
本质: MRR 在本质上是一种用空间换时间的算法
不好解释,先来看个例子:
select * from tb where key_column = x
在没有MRR的情况下,它是这样得到结果的:
1. select key_column, pk_column from tb where key_column=x order by key_column ---> 假设这个结果集是t
2. for each row in t ; select non_key_column from tb where pk_column = pk_column_value。(在Oracle里第2步叫回表?)
在有MRR的情况下,它是这样执行的:
1. select key_column, pk_column from tb where key_column = x order by key_column ---> 假设这个结果集是t
2. 将结果集t放在buffer里面(直到buffer满了),然后对结果集t按照pk_column排序 ---> 假设排序好的结果集是t_sort
3. select non_key_column fromtb where pk_column in (select pk_column from t_sort)
两者的区别主要是两点:
1. 没有MRR的情况下,随机IO增加,因为从二级索引里面得到的索引元组是有序,但是他们在主键索引里面却是无序的,所以每次去主键索引里面得到non_key_column的时候都是随机IO。(如果索引覆盖,那也就没必要利用MRR的特性了,直接从索引里面得到所有数据)
2. 没有MRR的情况下,访问主键索引的次数也会增加。没有MRR的情况下,二级索引里面得到多少行,那么就要去访问多少次主键索引(也不能完全这样说,因为MySQL实现了BNL),而有了MRR的时候,次数就大约减少为之前次数t/buffer_size。
所以说MRR主要解决的就是这两个问题。
此外,MRR还可以将某些范围查询,拆分为键值对,以此来进行批量的数据查询。这样做的好处是可以在拆分过程中,直接过滤一些不符合查询条件的数据。
如:
官方文档:https://dev.mysql.com/doc/refman/5.7/en/mrr-optimization.html
> SELECT * FROM t WHERE key_part1 >=1000 AND key_part1 < 2000 AND key_part2 = 1000;
表t有(key_part1,key_part2)的联合索引,因此索引根据key_part1,key_part2的位置关系进行排序。若没有MRR,此时查询类型为Range,SQL优化器会先将key_part1大于1000且小于2000的数据都取出来,即便key_part2不等于1000。取出后再根据key_part2的条件进行过滤。这会导致无用的数据被取出。
如果启用MRR优化器会使性能有巨大的提升,优化器会先将查询条件拆分为(1000,1000),(1001,1000),(1002,1000)....(1999,1000) 最后再根据这些拆分出的条件进行数据的查询。
是否启用MRR优化,可以通过参数optimizer_switch中的flag来控制。当MRR为on时,表示启用MRR优化。mrr_cost_based表示是否通过costbased的方式来选择是否启用mrr。若设置mrr=on,mrr_cost_based=off,则总是启用MRR优化。如下:
> SET GLOBAL optimizer_switch='mrr=on,mrr_cost_based=off';
参数read_rnd_buffer_size用来控制键值的缓冲区大小。当大于该值时,则执行器对已经缓存的数据根据RowID进行排序,并通过RowID来取得行数据,该值默认是256KB
>show VARIABLES like 'read_rnd_buffer_size';
+----------------------+---------+
| Variable_name | Value |
|----------------------+---------|
| read_rnd_buffer_size | 262144 |
+----------------------+---------+
mysql optimizer mrr_mysql mrr介绍相关推荐
- mysql开启mrr_MySQL MRR介绍
这个文章的原始出处找不到了. 什么是MRR? MRR:multi range read.不好解释,先来看个例子: select * from tb where key_column = x 在没有MR ...
- mysql optimizer mrr_mysql 索引优化特性之MRR
MRR针对于辅助索引上的范围查询进行优化,收集辅助索引对应主键rowid.进行排序后回表查询,随机IO转顺序IO 当我们需要对大表(基于辅助索引)进行范围扫描时,会导致产生许多随机/O.而对于普通磁盘 ...
- mysql optimizer mrr_MySQL优化器功能开关optimizer_switch
MySQL 8.0新增特性 use_invisible_indexes:是否使用不可见索引,MySQL 8.0新增可以创建invisible索引,这一开关控制优化器是否使用invisible索引,on ...
- mysql optimizer mrr_[转] MySQL 的 MRR 到底是什么?
引入 MRR,全称「Multi-Range Read Optimization」. 简单说:MRR 通过把「随机磁盘读」,转化为「顺序磁盘读」,从而提高了索引查询的性能. 至于: 为什么要把随机读转化 ...
- MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;
一. MySQL 中的执行计划 1 MySQL 执行计划 在 MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL 是 如何处理 SQL 语句的. 2 M ...
- MySQL Cluster 群集安装环境介绍
MySQL Cluster 群集安装环境介绍 MySQL 群集支持的操作系统: * Linux (Red Hat, Novell/SUSE) * Sun Solaris * IBM AIX * HP- ...
- mysql optimizer组件_MySQL Optimizer
最后更新:2018-10-09 当前版本:1.9.1 应用大小:8.8 MB 应用语言:英文 系统要求:OS X 10.11 或更高 应用描述: MySQL和MariaDB优化工具 MySQL Opt ...
- Mysql数据库的简单介绍
在当今的大数据时代,数据库已成为必不可少的数据工具.什么是数据库呢,数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. MYSQL是目前最为流行的关系型数据库系统,关系型数据库系统 ...
- [转载]MySQL exists的用法介绍
原文摘自:http://www.cnblogs.com/glory-jzx/archive/2012/07/19/2599215.html MySQL exists的用法介绍 有一个查询如下: 1 S ...
最新文章
- 男人约会动机大揭秘。
- 百度开源的 71 个项目,看看你用过几个?
- python读取中文-python读取中文txt文本
- Java TheadLocal
- 驱动框架2——内核驱动框架中LED的基本情况、初步分析
- 【JAVA 第五章 】课后习题 Vector类的 初使用
- 输入问题C++字符数组越界问题的一个案例分析
- LeetCode--026--删除排序数组中的重复项(java)
- 微信APP支付 C#
- # Vue 组件开发打包、Vue 项目打包、js库组件库打包使用
- vscode终端显示中文字符乱码解决
- 高质量代码命名规则 代码整洁之道
- 基于数据挖掘技术的客户保有应用研究
- mysql 进行加减乘除运算,mysql加减乘除
- c++【吃鸡坑人版8.0】免费复制
- 3 万字 + 100 张图带你彻底搞懂 TCP 面试题(强烈建议收藏)
- “===”、“==” 的区别
- 多系统单点登录(sso)设计
- Jumpstart Client安装日志
- 微软等数据结构+算法面试100题全部答案集锦 复制过来比较乱
热门文章
- 云栖谷楼盘沙盘_云栖谷图片相册,户型图,样板间图,装修效果图,实景图-长沙房天下...
- 商务邮箱注册大全,邮箱有哪些类型可选择?
- Graphics类绘制图形
- android 从手机自带图库选取图片作为应用背景图
- MATLAB电动助力转向系统/EPS模型
- [设计模式]设计模式之禅关于单例模式
- 如何利用悟空CRM实现售后服务派工单管理
- EN 14351-1窗和外部行人门—CE认证
- ​RV050蜗轮蜗杆减速机可以配多大功率的电机?
- 计算机防ping取消,如何防止别人ping通本地电脑