mysql开启mrr_MySQL MRR介绍
这个文章的原始出处找不到了。
什么是MRR?
MRR:multi range read。不好解释,先来看个例子:
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开启mrr_MySQL MRR介绍相关推荐
- mysql optimizer mrr_mysql mrr介绍
转载于: https://blog.51cto.com/lee90/2058185 什么是MRR? MRR:multi range read. 本质: MRR 在本质上是一种用空间换时间的算法 不好解 ...
- mysql开启mrr_mysql 之 MRR
Multi-Range Read (MRR) MRR 的全称是 Multi-Range Read Optimization,是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手 ...
- 简单介绍MySQL开启事务的两种方式
本篇文章给大家分享MySQL 是如何开启一个事务的,原文通过两种方式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧 方式 1 START TRANSACTION 或 ...
- mysql using mrr_MySQL 的 MRR 到底是什么?
MRR,全称「Multi-Range Read Optimization」. 简单说:MRR 通过把「随机磁盘读」,转化为「顺序磁盘读」,从而提高了索引查询的性能. 至于: 为什么要把随机读转化为顺序 ...
- mysql using mrr_MySQL InnoDB MRR优化指南
前言 MRR 是 Multi-Range Read 的简写,目的是减少磁盘随机访问,将随机访问转化为较为顺序的访问.适用于 range/ref/eq_ref 类型的查询. 实现原理: 1.在二级索引查 ...
- 诛仙mysql怎么开战场_战场介绍:诛仙2普通战场开启条件及介绍
导语:本文为你介绍诛仙2普通战场开启条件及介绍 普通战场是未飞升的玩家可以参与的战场.在战场中玩家可以获得大量的经验和各种战场奖励. ●战场开启 战场的开启需要全服务器成员的努力.只有服务器内成员的等 ...
- mysql geo_地理位置geo处理之mysql函数的详细介绍(附代码)
本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...
- mysql mrr_cost_based_【MRR】转-MySQL 的 MRR 优化
MRR,全称「Multi-Range Read Optimization」. 简单说:MRR 通过把「随机磁盘读」,转化为「顺序磁盘读」,从而提高了索引查询的性能. 至于: 为什么要把随机读转化为顺序 ...
- linux mysql开远程访问,Linux mysql开启远程访问
默认情况下远程访问会出现 Can't connect to MySQL server on '192.168.10.18′ (10061) 错误 是因为,mysql的默认配置为了增强安全性,禁止了非本 ...
最新文章
- c++ vscode 第三方库_Windows平台配置VSCode的C/C++环境,超清晰
- 常用的webservice接口
- Exchange Server 2010 灾难恢复
- 零基础学编程学java还是python-小白学编程选java、php、前端还是python
- 骚操作!用铁丝做“电路”,不服不行!
- vue中mixin 感觉很牛逼(父子组件融合成一个新组件)
- mysql增加sort_buffer_设置sort_buffer_size
- python 保存文件 吃内存_孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化...
- 瓦片地图与geoserver发布
- 【ACL2021】BERT也能做生成?利用多个BERT模型分离对话生成和对话理解
- EMNLP 2018 | 为什么使用自注意力机制?
- [RTOS]uCOS、FreeRTOS、RTThread、RTX等RTOS的对比之特点
- 架构师到底该不该写代码?
- php微信聊天带语音,使用Html5多媒体实现微信语音功能
- 超级简单的私有云笔记+私有云网盘
- 小程序 | 小程序中常用的事件 + 事件对象的属性列表 +小程序事件传参 + 小程序全局配置 + 小程序页面配置 + 小程序发起网络数据请求
- JavaWeb技术内幕八:JVM内存管理
- 小学计算机课优质课,2018年武汉市小学信息技术优质课评比
- 推荐一款MySQL开源客户端,免费+跨平台+使用便捷
- [python小工具]随机调用一个浏览器打开网页