我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中MRR如何优化范围查询

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中MRR如何优化范围查询

一、MRR优化概述

MRR,全称Multi-Range Read Optimization,直译为多范围读取优化,是mysql中一种用于提高索引查询性能的技术。MRR通过减少随机磁盘访问次数,将随机IO转换为顺序IO,从而提高数据读取的效率。它特别适用于包含范围条件(如BETWEEN、<、>等)的查询,以及需要通过辅助索引访问表数据的场景。

二、MRR优化的背景

在InnoDB中表数据是通过聚集索引组织的。当基于辅助索引的范围查询时,需要先通过辅助索引找到对应的主键值,再通过主键值回表查询完整的行数据。这种回表会产生大量的随机磁盘I/O,尤其是在处理大表时,随机I/O的性能瓶颈尤为明显。MRR优化正是为了解决这一问题提出。

三、MRR优化的原理

MRR优化的核心思想是将多个范围查询中的随机磁盘I/O转换为顺序磁盘I/O,从而提高查询性能。

MySQL中MRR如何优化范围查询

  1. 扫描辅助索引并收集主键值

    • 当执行一个包含范围条件的查询时,MySQL优化器首先会扫描辅助索引,找到满足条件的一系列索引元组。
    • 对于每个索引元组,MySQL会收集其对应的主键值(rowid)。
  2. 对主键值进行排序

    • 收集到的主键值会被放入一个内存缓冲区(read_rnd_buffer)中。
    • 当缓冲区满或查询结束时,MySQL会对缓冲区中的主键值进行排序。排序的目的是为了将随机访问转换为顺序访问。
  3. 顺序访问基表

    • 排序后的主键值将按照顺序被用来访问基表,检索出完整的数据行。
    • 由于主键值是有序的,因此访问基表时产生的磁盘I/O也变为顺序I/O,从而提高了读取效率。
  4. 利用磁盘预读和缓存机制

    • MRR优化还充分利用了磁盘的预读机制。当请求读取某一页数据时,磁盘会预测并提前读取相邻的几页数据到内存中。
    • 由于MRR将随机访问转换为顺序访问,磁盘预读机制能够更好地发挥作用,减少磁盘寻道时间和旋转延迟。
    • 同时,顺序访问也提高了缓存的命中率,因为连续访问的数据页更有可能在缓存中找到。
  5. 基于成本的决策

    • MySQL优化器会根据查询的成本(如I/O成本、CPU成本等)来决定是否使用MRR优化。
    • 用户可以通过调整optimizer_switch系统变量中的mrrmrr_cost_based标志来控制MRR优化的使用。mrr_cost_based设置为ON时,优化器会根据成本来决定是否使用MRR;设置为OFF时,则强制使用MRR(但通常不建议这样做,因为优化器在大多数情况下都是正确的)。

四、MRR优化的优势

  • 提高查询性能:通过减少随机磁盘I/O次数和提高缓存命中率,MRR优化能够显著提高查询性能。
  • 减少I/O成本:顺序I/O比随机I/O具有更低的成本,因为顺序I/O可以更有效地利用磁盘带宽和缓存资源。
  • 适用于多种查询类型:MRR优化不仅适用于范围查询(如BETWEEN、<、>等),还适用于等值连接(equi-join)等需要回表访问的场景。

五、磁盘预读机制

MRR优化充分利用了磁盘预读机制。当客户端请求读取某一页数据时,磁盘预读功能会预测并提前读取相邻的几页数据到内存缓冲区中。由于MRR将随机访问转换为顺序访问,磁盘预读机制能够更好地发挥作用,减少磁盘寻道时间和旋转延迟,进一步提升读取效率。

六、局部性原理

局部性原理是MRR优化的另一个理论基础。时间局部性表明,如果某个数据项被访问,那么在不久的将来它可能再次被访问;空间局部性表明,一旦某个数据项被访问,那么其附近的数据项也可能很快被访问。MRR通过顺序访问数据,使得数据访问更加符合局部性原理,从而提高了缓存命中率,减少了磁盘访问次数。

七、使用场景、条件与监控

MRR优化适用于基于范围扫描和等值连接的操作中尤为有效。但是,并非所有查询都能从MRR优化中受益。如,当查询完全基于索引元组中的信息(即使用覆盖索引)时,MRR优化就没有必要,因为此时无需回表访问基表数据。

此外,MySQL默认开启MRR优化,但是否真正使用MRR由优化器决定。优化器会根据查询的成本(如IO成本、CPU成本等)来决定是否采用MRR优化。用户可以通过调整optimizer_switch系统变量中的mrrmrr_cost_based标志来控制MRR优化的使用。

1. 配置参数

  • optimizer_switch:包含mrr和mrr_cost_based两个选项,分别用于控制是否启用MRR优化以及是否基于成本决定是否使用MRR。
  • read_rnd_buffer_size:设置用于给rowid排序的内存缓冲区的大小。这个参数的大小会影响MRR优化的效果,需要根据实际情况进行调整。

2. 监控方法

  • 使用EXPLAIN语句查看查询的执行计划。如果查询使用了MRR优化,EXPLAIN的输出会在Extra列中显示Using MRR。
  • 监控查询的响应时间和I/O开销。通过比较开启和关闭MRR优化时的查询性能,可以评估MRR优化的效果。

八、SQL案例解读

一个为orders的表结构如下:

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT NOT NULL,
    order_date DATE NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    INDEX idx_customer_date (customer_id, order_date)
) ENGINE=InnoDB;

表中,customer_idorder_date上有一个联合索引idx_customer_date。想要查询某个特定客户在指定日期范围内的所有订单,SQL语句:

SELECT * FROM orders WHERE customer_id = 123 AND order_date BETWEEN '2023-01-01' AND '2023-12-31';
  1. 扫描辅助索引

    • MySQL首先会利用辅助索引idx_customer_date来定位满足customer_id = 123order_date BETWEEN '2023-01-01' AND '2023-12-31'条件的索引元组。
    • 这些索引元组包含了customer_idorder_date以及对应的主键值(id)。
  2. 收集并排序主键值

    • MySQL会收集这些索引元组对应的主键值,并将它们放入一个内存缓冲区(read_rnd_buffer)中。
    • 当缓冲区满或查询结束时,MySQL会对这些主键值进行排序。排序的目的是为了后续的顺序访问基表。
  3. 顺序访问基表

    • 使用排序后的主键值,MySQL将顺序访问orders表的基表部分,检索出完整的订单数据行。
    • 由于主键值是有序的,因此访问基表时产生的磁盘I/O变为顺序I/O,提高了读取效率。
  4. 利用磁盘预读和缓存机制

    • 在顺序访问基表的过程中,磁盘预读机制会预测并提前读取相邻的数据页到内存中。
    • 这有助于减少磁盘寻道时间和旋转延迟,并提高缓存命中率。
  5. 查询性能提升

    • 相比没有MRR优化的情况,使用MRR可以显著减少随机磁盘I/O的次数,从而提高查询性能。
    • 特别是在处理大表时,MRR优化的效果更加明显。

以上就是MySQL中MRR如何优化范围查询的详细内容,更多关于MySQL MRR优化范围查询的资料请关注编程网(www.lsjlt.com)其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中MRR如何优化范围查询

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL中MRR如何优化范围查询

目录一、MRR优化概述二、MRR优化的背景三、MRR优化的原理四、MRR优化的优势五、磁盘预读机制六、局部性原理七、使用场景、条件与监控1. 配置参数2. 监控方法八、SQL案例解读一、MRR优化概述MRR,全称Multi-Range R
MySQL中MRR如何优化范围查询
2024-10-10

MySQL中BETWEEN AND(范围查询)

0 写在前面 MySQL 提供了 BETWEEN AND 关键字,用来判断字段的数值是否在指定范围内。 BETWEEN AND 需要两个参数,即范围的起始值和终止值。如果字段值在指定的范围内,则这些记录被返回。如果不在指定范围内,则不会被返
2023-08-16

MySQL范围查询优化的场景实例详解

目录思考题范围查询-基础场景一: a = 1 and b = 2 and c = 3场景二: a > 1 and b = 2场景三:a > 1 and b = 2 and c > 3编程客栈场景四: a > 1 ORDER BY b场景五:
2022-06-13

如何通过索引优化PHP与MySQL的地理位置查询和范围查询?

摘要:地理位置查询和范围查询是许多应用程序中常见的查询操作。本文将介绍如何使用索引优化PHP与MySQL的地理位置查询和范围查询,通过减少查询时间提高应用程序的性能。同时,还将提供具体的代码示例以供参考。引言:在许多应用程序中,地理位置查询
2023-10-21

php如何查询时间范围

小编今天带大家了解php如何查询时间范围,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“php如何查询时间范围”的知识吧。php查询时
2023-06-26

mongodb的距离范围如何查询

在MongoDB中,可以使用`$geoNear`运算符和`$geoWithin`运算符来进行距离范围查询。1. 使用`$geoNear`运算符进行距离排序和筛选:```javascriptdb.collection.aggregate([{
2023-09-01

如何优化MySQL查询

这篇文章给大家介绍如何优化MySQL查询,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。解析器和预处理器一开始,MySQL 的解析器将查询语句拆分成一系列指令并从中构建一棵“解析树”。解析器使用 MySQL 的SQL 语
2023-06-15

MySQL如何优化查询速度

前面章节我们介绍了如何选择优化的数据类型、如何高效的使用索引,这些对于高性能的MySQL来说是必不可少的。 但这些还完全不够,还需要合理的设计查询。 如果查询写的很糟糕,即使表结构再合理、索引再合适,也是无法实现高性能的。 谈到MySQL性
2022-05-23

MySQL之join查询如何优化

这篇文章主要介绍“MySQL之join查询如何优化”,在日常操作中,相信很多人在MySQL之join查询如何优化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL之join查询如何优化”的疑惑有所帮助!
2023-07-05

如何优化mysql查询速度

要优化 MySQL 查询速度,可以采取以下几种方法:使用合适的索引:在查询中使用索引可以显著提高查询速度。确保表中的字段都有适当的索引,尤其是在经常用作查询条件的字段上。避免全表扫描:尽量避免对整个表进行扫描,可以通过添加索引或优化查询语句
如何优化mysql查询速度
2024-05-23

如何优化MySQL循环查询

要优化MySQL循环查询,可以采取以下几种方法:使用JOIN操作:尽量避免在循环中进行多次查询,可以通过使用JOIN操作将多个查询合并成一个查询,减少查询次数,提高效率。使用索引:为经常被查询的字段建立索引,可以加快查询速度。同时,尽量避免
如何优化MySQL循环查询
2024-04-29

mysql in慢查询如何优化

这篇文章主要介绍“mysql in慢查询如何优化”,在日常操作中,相信很多人在mysql in慢查询如何优化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql in慢查询如何优化”的疑惑有所帮助!接下来
2022-12-30

如何优化数据库的数据范围

优化数据库的数据范围可以通过以下几种方式来实现:索引优化:为经常查询的字段创建索引,可以加快查询速度,减少数据范围的扫描范围。数据分区:将数据库按照一定规则进行分区,可以减少查询数据范围的大小,提高查询性能。数据清理:定期清理数据库中过
如何优化数据库的数据范围
2024-07-03

如何优化 PHP 中的 MySQL 查询性能?

可以通过以下方式优化 mysql 查询性能:建立索引,将查找时间从线性复杂度降至对数复杂度。使用 prepared statements,防止 sql 注入并提高查询性能。限制查询结果,减少服务器处理的数据量。优化连接查询,包括使用适当的连
如何优化 PHP 中的 MySQL 查询性能?
2024-05-11

编程热搜

目录