MySQL的MRR(Multi-Range Read)优化原理详解

news2024/9/24 19:28:09
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

文章目录

    • 引言
    • MRR优化概述
      • 定义
      • 重要性
    • MRR优化原理
      • 基本流程
      • 优点
      • 影响因素
    • 如何利用MRR优化
      • 开启MRR
      • 调整read_rnd_buffer_size
      • 优化查询和索引
    • 最后

引言

在数据库管理系统中,查询性能是评估系统优劣的重要指标之一。MySQL作为广泛使用的开源关系型数据库管理系统,不断优化其内部机制以提升查询效率。其中,MRR(Multi-Range Read)优化技术是一种针对范围查询和索引扫描的有效优化手段。本文将深入解析MySQL中MRR优化的原理,探讨其工作机制及在数据库性能提升中的应用。

MRR优化概述

定义

MRR,全称Multi-Range Read Optimization,即多范围读取优化,是MySQL在处理范围查询时采用的一种优化策略。它旨在通过减少磁盘I/O操作的次数和提高I/O操作的效率,从而加速查询过程。

重要性

在传统的查询处理过程中,当执行范围查询时,MySQL会逐个访问索引项,并根据索引项中的主键或行指针回表查找完整的数据行。这种方式在数据量较大时,会导致大量的随机磁盘I/O操作,严重影响查询性能。MRR优化通过改变这一处理流程,将随机I/O转化为顺序I/O,从而显著提高查询效率。

MRR优化原理

基本流程

MRR优化的基本流程可以概括为以下几个步骤:

  1. 索引扫描:首先,MySQL使用辅助索引进行扫描,找到所有满足查询条件的索引项。这些索引项通常包含主键值或行指针。

  2. 收集与排序:接着,MySQL将收集到的索引项中的主键值或行指针进行排序。排序的目的是为了后续能够按顺序访问数据行,从而减少磁盘I/O的随机性。

  3. 分批读取:排序完成后,MySQL会根据read_rnd_buffer_size参数的设置,将排序后的主键值或行指针分批读入内存中的read_rnd_buffer。

  4. 顺序访问基表:最后,MySQL按照read_rnd_buffer中的顺序,依次回表访问基表,获取完整的数据行。由于此时的数据访问是顺序的,因此可以充分利用磁盘的预读机制和缓存优势,提高数据读取的效率。

优点

  • 减少随机I/O:通过排序和分批读取,MRR将原本可能需要大量随机I/O的查询转化为顺序I/O,从而减少了磁盘的寻道时间和旋转延迟。
  • 提高缓存效率:顺序I/O可以更好地利用操作系统的磁盘缓存和MySQL的InnoDB缓冲池,提高缓存命中率,减少物理磁盘的访问次数。
  • 优化查询性能:特别是在处理大量数据和复杂查询时,MRR优化能够显著提升查询性能,降低查询响应时间。

影响因素

  • read_rnd_buffer_size:该参数决定了read_rnd_buffer的大小,即每次能够读入内存的主键值或行指针的数量。合理设置该参数对于优化MRR性能至关重要。
  • 查询类型:MRR优化主要适用于范围查询和包含多个范围条件的查询。对于简单的等值查询或全表扫描,MRR可能无法带来显著的性能提升。
  • 索引设计:良好的索引设计能够确保MySQL能够高效地利用MRR优化。例如,为查询中经常使用的列创建辅助索引,并确保这些索引与查询条件中的列顺序相匹配。

如何利用MRR优化

开启MRR

MySQL从5.6版本开始默认开启了MRR优化。你可以通过查询optimizer_switch系统变量来确认MRR是否已开启:

SHOW VARIABLES LIKE 'optimizer_switch';

如果mrrmrr_cost_based的值都是ON,则表示MRR优化已开启。

调整read_rnd_buffer_size

根据实际的查询负载和服务器硬件配置,合理调整read_rnd_buffer_size参数可以进一步优化MRR性能。该参数的值设置得过大可能会浪费内存资源,而设置得过小则可能无法充分发挥MRR优化的效果。

优化查询和索引

  • 优化查询:尽量避免在查询条件中使用函数或表达式,确保查询能够高效地利用索引。
  • 优化索引:根据查询模式合理设计索引,确保索引能够覆盖查询中的常用列,并尽量减少回表次数。

最后

MRR优化是MySQL中一种重要的查询优化技术,它通过减少磁盘I/O的随机性和提高缓存效率,显著提升了查询性能。在实际应用中,合理开启MRR优化、调整相关参数以及优化查询和索引设计,都是提升MySQL数据库性能的有效手段。


关注公众号[码到三十五]获取更多技术干货 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode:反转区间内的链表

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 反转区间内的链表题目链接方法一&#xff1a;拆开反转…

【TB作品】PIC16F1719单片机,EEPROM,PFM,读写

对于PIC16F1719单片机&#xff0c;没有直接的EEPROM&#xff0c;而是使用高耐久度的程序闪存&#xff08;PFM&#xff09;作为非易失性数据存储区域。这个区域特别适合存储那些需要频繁更新的数据。读写这个内存区域需要操作一些特殊功能寄存器&#xff0c;比如用于地址的PMADR…

2.K8s集群搭建

K8s搭建 搭建方案kubeadm搭建系统初始化操作k8s Master节点初始化将node节点加入集群安装网络插件Calico集群测试 搭建方案 minikube&#xff1a;轻量化的Kubernetes集群&#xff0c;为了能够更好学习和体验k8s功能而推出的&#xff0c;借助个人PC的虚拟化环境就可以实现Kuber…

如何使用ssm实现基于java web的网上书城系统的设计与实现+vue

TOC ssm123基于java web的网上书城系统的设计与实现vue JAVA简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;JSP&#xff…

【Redis】Redis客户端——Jedis(Java)

Redis Java使用案例 环境配置引入依赖配置端⼝转发连接 Redis Server Java基础代码操作Redisset 和 getexsits 和 del 环境配置 引入依赖 Java 操作 redis 的客⼾端有很多. 其中最知名的是 jedis. 创建 maven 项⽬, 把 jedis 的依赖拷⻉到 pom.xml 中. <!-- https://mvnr…

ssrf--web-ssrfme例题

将web-ssrfme.zip解压缩在Ubuntu下 Docker-compose up -d 更新后的镜像重新启动容器 可以看到已经拉取成功ssrfme镜像 我们使用端口访问文件&#xff0c;可以看到有一个过滤条件&#xff0c;它限制了file&#xff0c;dict协议&#xff0c;127.0.0.1和localhost 也不能用&…

【55-90】结构型模式

目录 一.结构型模式概述 二.代理模式 2.1 概述 2.2 结构 2.3 静态代理 2.4 JDK动态代理 2.5 CGLIB动态代理 2.6 三种代理的对比 2.7 优缺点 三.适配器模式 3.1 概述 3.2 结构 3.3 类适配器模式 3.4 对象适配器模式 3.5 应用场景 四.装饰者模式 4.1 概述 4.2 结…

从并发20到并发120之laravel性能优化

调优成果 遇到问题 单台服务并发20&#xff0c;平均响应时间1124ms&#xff0c;通过htop观察&#xff0c;发现cpu占用率达到100%&#xff08;包括sleep的进程&#xff09;&#xff0c;内存几乎没怎么用。 调优后 单机最大吞吐量达到120 响应时长不超过1000ms 硬件信息 …

数学建模----线性回归分析(引入热力图的绘制方法)

目录 0.直击重点 1.一元线性回归分析 1.1散点图的绘制 1.2相关性的分类 1.3计算相关系数 1.4模型的检验 1.5模型的预测 2.多重线性回归分析&#xff08;上&#xff09; 2.1多重线性的概念 2.2散点图的分类 2.3热力图的绘制 2.4根据结果确定新的变量 3.多重线性…

【开端】 如何判断手机号码属于哪个国家(手机号判断正则)汇总

import org.apache.commons.lang3.StringUtils; /** * 手机号判断正则 */ public enum MobileRegularExp { /** * 国家 正则 */ CN("中国", 86, "^(\\?0?86\\-?)?1[3456789]\\d{9}$"), TW("中国台湾", 886, "…

第七节 循环结构;goto语句

目录 7.1 while循环 7.1.1 if 和 while的对⽐ 7.1.2 while的执行流程 7.1.3 while的练习 7.2 for循环 7.2.1 语法形式 7.2.2 for循环的执⾏流程 7.2.3 for 循环的练习 7.3 while 和 for 循环的对比 7.4 do while 循环 7.4.1 do while 的语法形式 7.4.2 do while循…

Jamba前生今世:1.5开源来袭

AI21服务于企业&#xff0c;为企业构建基础模型和AI系统以加速GenAI在生产中的使用。AI21 成立于2017年&#xff0c;已从NVIDIA、Intel、Google等公司共筹集了3.36亿美元。它是最早将生成式AI推向大众的公司之一&#xff0c;借助AI21平台&#xff0c;企业可以构建自己的生成式A…

菲菲更名宝贝:批量处理,文件命名不再繁琐

你是否有这样的经历&#xff1f;曾几何时&#xff0c;在堆积如山的文件中迷失方向&#xff0c;为了一个个手动重命名文件而加班到深夜&#xff1f;是否渴望有一种魔法&#xff0c;能瞬间让你的文件整理得井井有条&#xff0c;让繁琐的命名工作变得轻松愉快&#xff1f;那么&…

大数据毕业设计开题报告100例

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…

前端网站优化-Brotli 压缩

杨绛先生说:“岁不声不响&#xff0c;你且不慌不忙。在凡俗的烟火里&#xff0c;愿以素心&#xff0c;阅来日方长。生活总是一地鸡毛&#xff0c;繁杂琐碎的日常&#xff0c;无力掌控的局面&#xff0c;以及猝不及防的变化&#xff0c;让日子多了几分慌张”。 市井长巷&#xf…

ssrf漏洞复现

环境搭建 zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台 (github.com) 直接将其复制到linux环境下拉取docker就行 我这里已经拉去过了&#xff0c;如果拉去速度慢话&#xff0c;可以在/etc/docker下的daemon.json中配置镜像加速 vim /etc/docker/daemon.js…

大模型学习笔记 - LLM 对齐优化算法 DPO

LLM - DPO LLM - DPO DPO 概述DPO 目标函数推导DPO 目标函数梯度的推导 DPO 概述 大模型预训练是从大量语料中进行无监督学习&#xff0c;语料库内容混杂&#xff0c;训练的目标是语言模型损失&#xff0c;任务是next token prediction&#xff0c;生成的token 不可控&…

MyBatis-Plus分页插件使用详解

一、简述 在使用mybatis开发项目的时候我们通常使用pagehelper来进行分页操作&#xff0c; 但是我们在使用MyBatis-Plus 开发时&#xff0c;MyBatis-Plus内置已经有分页功能了&#xff0c;其实不需要在额外引入pagehelper依赖了&#xff0c;而且两者同时引入有时候还会导致分页…

主流商品API接口在电商跨境电商企业应用/项目中的重要作用

618狂欢已经开启&#xff0c;为了获取更大利益&#xff0c;电商商家应使用价格接口系统。价格接口对电商商家有多方面的好处&#xff0c;主要体现在以下几个方面&#xff1a; 1、价格接口系统可以帮助品牌和商家实现更加科学和精准的定价策略。通过实时获取多个主流电商平台&a…

公众号里面的试卷怎么打印

经过我们的观察发现&#xff0c;微信公众号中的试卷通常有两种形式&#xff1a;图片和文档。如果试卷是以图片的形式嵌入在文章中作为配图&#xff0c;您只需点击图片并长按&#xff0c;选择“保存图片”到手机中。之后&#xff0c;您可以选择任何方便的方式完成打印。 不过&am…