iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 中MRR的作用是什么
  • 134
分享到

MySQL 中MRR的作用是什么

2024-04-02 19:04:59 134人浏览 安东尼
摘要

Mysql 中MRR的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。执行一个范围查询:mysql > ex

Mysql 中MRR的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

执行一个范围查询:

mysql > explain select * from stu where age between 10 and 20; +----+-------------+-------+-------+------+---------+------+------+-----------------------+ | id | select_type | table | type  | key  | key_len | ref  | rows | Extra                 | +----+-------------+-------+-------+----------------+------+------+-----------------------+ |  1 | SIMPLE      |  stu  | range | age  | 5       | NULL |  960 | Using index condition | +----+-------------+-------+-------+----------------+------+------+-------------

当这个 sql 被执行时,MySQL 会按照下图的方式,去磁盘读取数据(假设数据不在数据缓冲池里):

MySQL 中MRR的作用是什么

图中红色线就是整个的查询过程,蓝色线则是磁盘的运动路线。

这张图是按照 Myisam 的索引结构画的,不过对于 Innodb 也同样适用。

对于 Myisam,左边就是字段 age 的二级索引,右边是存储完整行数据的地方。

先到左边的二级索引找,找到第一条符合条件的记录(实际上每个节点是一个页,一个页可以有很多条记录,这里我们假设每个页只有一条),接着到右边去读取这条数据的完整记录。

读取完后,回到左边,继续找下一条符合条件的记录,找到后,再到右边读取,这时发现这条数据跟上一条数据,在物理存储位置上,离的贼远!

咋办,没办法,只能让磁盘和磁头一起做机械运动,去给你读取这条数据。

第三条、第四条,都是一样,每次读取数据,磁盘和磁头都得跑好远一段路。

磁盘的简化结构可以看成这样:

MySQL 中MRR的作用是什么

MySQL 中MRR的作用是什么

可以想象一下,为了执行你这条 sql 语句,磁盘要不停的旋转,磁头要不停的移动,这些机械运动,都是很费时的。

10,000 RPM(Revolutions Per Minute,即转每分) 的机械硬盘,每秒大概可以执行 167  次磁盘读取,所以在极端情况下,MySQL 每秒只能给你返回 167 条数据,这还不算上 CPU 排队时间。

上面讲的都是机械硬盘,SSD 的土豪,请随意 - -

对于 Innodb,也是一样的。 Innodb 是聚簇索引(cluster index),所以只需要把右边也换成一颗叶子节点带有完整数据的 B+ tree  就可以了。

顺序读:一场狂风暴雨般的革命

到这里你知道了磁盘随机访问是多么奢侈的事了,所以,很明显,要把随机访问转化成顺序访问:

mysql > set optimizer_switch='mrr=on'; Query OK, 0 rows affected (0.06 sec)  mysql > explain select * from stu where age between 10 and 20; +----+-------------+-------+-------+------+---------+------+------+----------------+ | id | select_type | table | type  | key  | key_len | ref  | rows | Extra          | +----+-------------+-------+-------+------+---------+------+------+----------------+ |  1 | SIMPLE      | tbl   | range | age  |    5    | NULL |  960 | ...; Using MRR | +----+-------------+-------+-------+------+---------+------+------+----------------+

我们开启了 MRR,重新执行 sql 语句,发现 Extra 里多了一个「Using MRR」。

这下 MySQL 的查询过程会变成这样:

MySQL 中MRR的作用是什么

对于 Myisam,在去磁盘获取完整数据之前,会先按照 rowid 排好序,再去顺序的读取磁盘。

对于 Innodb,则会按照聚簇索引键值排好序,再顺序的读取聚簇索引。

顺序读带来了几个好处:

1、磁盘和磁头不再需要来回做机械运动;

2、可以充分利用磁盘预读

比如在客户端请求一页的数据时,可以把后面几页的数据也一起返回,放到数据缓冲池中,这样如果下次刚好需要下一页的数据,就不再需要到磁盘读取。这样做的理论依据是计算机科学中著名的局部性原理:

当一个数据被用到时,其附近的数据也通常会马上被使用。

3、在一次查询中,每一页的数据只会从磁盘读取一次

MySQL 从磁盘读取页的数据后,会把数据放到数据缓冲池,下次如果还用到这个页,就不需要去磁盘读取,直接从内存读。

但是如果不排序,可能你在读取了第 1 页的数据后,会去读取第2、3、4页数据,接着你又要去读取第 1 页的数据,这时你发现第 1  页的数据,已经从缓存中被剔除了,于是又得再去磁盘读取第 1 页的数据。

而转化为顺序读后,你会连续的使用第 1 页的数据,这时候按照 MySQL  的缓存剔除机制,这一页的缓存是不会失效的,直到你利用完这一页的数据,由于是顺序读,在这次查询的余下过程中,你确信不会再用到这一页的数据,可以和这一页数据说告辞了。

顺序读就是通过这三个方面,最大的优化了索引的读取。

别忘了,索引本身就是为了减少磁盘 IO,加快查询,而 MRR,则是把索引减少磁盘 IO 的作用,进一步放大。

一些关于这场革命的配置

和 MRR 相关的配置有两个:

  • mrr: on/off

  • mrr_cost_based: on/off

第一个就是上面演示时用到的,用来打开 MRR 的开关:

mysql > set optimizer_switch='mrr=on';

如果你不打开,是一定不会用到 MRR 的。

另一个,则是用来告诉优化器,要不要基于使用 MRR 的成本,考虑使用 MRR 是否值得(cost-based choice),来决定具体的 sql  语句里要不要使用 MRR。

很明显,对于只返回一行数据的查询,是没有必要 MRR 的,而如果你把 mrr_cost_based 设为 off,那优化器就会通通使用  MRR,这在有些情况下是很 stupid 的,所以建议这个配置还是设为 on,毕竟优化器在绝大多数情况下都是正确的。

另外还有一个配置 read_rnd_buffer_size ,是用来设置用于给 rowid 排序的内存的大小。

显然,MRR 在本质上是一种用空间换时间的算法。MySQL 不可能给你无限的内存来进行排序,如果 read_rnd_buffer 满了,就会先把满了的  rowid 排好序去磁盘读取,接着清空,然后再往里面继续放 rowid,直到 read_rnd_buffer 又达到 read_rnd_buffe  配置的上限,如此循环。

看完上述内容,你们掌握MySQL 中MRR的作用是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 中MRR的作用是什么

本文链接: https://www.lsjlt.com/news/58840.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MySQL 中MRR的作用是什么
    MySQL 中MRR的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。执行一个范围查询:mysql > ex...
    99+
    2024-04-02
  • mysql中str_to_date的作用是什么
    小编给大家分享一下mysql中str_to_date的作用是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql中的st...
    99+
    2024-04-02
  • mysql中mysqld_multi的作用是什么
    这篇文章将为大家详细讲解有关mysql中mysqld_multi的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 _multi是用来管理...
    99+
    2024-04-02
  • mysql中MVCC的作用是什么
    本篇文章为大家展示了mysql中MVCC的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、说明多版并发控制MVCC是MySQL InnoDB存储引擎实现隔离等级的具体方法,用于实现提交阅...
    99+
    2023-06-15
  • mysql中limit的作用是什么
    在MySQL中,LIMIT子句用于限制查询结果集的数量。通过使用LIMIT子句,可以指定从查询结果中返回的行数的数量,并且可以指定起...
    99+
    2024-04-09
    mysql
  • mysql中json_search的作用是什么
    在MySQL中,JSON_SEARCH函数用于查找指定JSON文档中包含特定路径和值的元素。它的语法如下: JSON_SEARCH(...
    99+
    2024-04-09
    mysql
  • mysql中event的作用是什么
    MySQL中的事件(Event)是一种在数据库内部实现的调度任务工具,用于执行定期性的SQL语句或存储过程。通过创建事件,您可以指定...
    99+
    2024-04-09
    mysql
  • mysql中nextval的作用是什么
    在MySQL中,没有内置的nextval函数,这是因为MySQL没有像Oracle或PostgreSQL这样的序列对象。在MySQL...
    99+
    2024-04-09
    mysql
  • mysql中regex的作用是什么
    在MySQL中,REGEXP函数用于在查询中使用正则表达式来匹配文本。通过使用正则表达式,您可以更灵活地进行模糊搜索和匹配文本。这使...
    99+
    2024-04-09
    mysql
  • mysql中connection的作用是什么
    在MySQL中,connection是指与数据库建立的连接。连接用于建立与数据库的通信,执行SQL查询、插入、更新和删除等操作。通过...
    99+
    2024-04-02
  • mysql中basedir的作用是什么
    在MySQL中,basedir参数指定了MySQL安装的根目录的路径。该参数通常用于指定MySQL服务器的安装目录,以便MySQL能...
    99+
    2024-03-01
    mysql
  • mysql中current_date的作用是什么
    在MySQL中,CURRENT_DATE函数返回当前日期的值,格式为’YYYY-MM-DD’。它通常用于获取当前日期并将其用作查询或...
    99+
    2024-03-01
    mysql
  • mysql中myisam的作用是什么
    MyISAM 是 MySQL 中的一种存储引擎,它的作用是用于管理数据库表的存储和检索。使用 MyISAM 存储引擎的表在磁盘上以单...
    99+
    2024-03-15
    mysql
  • mysql中log_bin的作用是什么
    在MySQL中,log_bin是二进制日志文件的名称,用于记录所有对数据库进行更改的操作,如插入、更新、删除等。这些二进制日志文件可...
    99+
    2024-05-14
    mysql
  • mysql中repeat的作用是什么
    本篇文章为大家展示了mysql中repeat的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。repeat循环类似Java中的do while循环,直到条件不满足才会结束循环。语法:[别名:...
    99+
    2023-06-14
  • MySQL中Timeout的作用是什么
    今天就跟大家聊聊有关MySQL中Timeout的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。connect_timeout、intera...
    99+
    2024-04-02
  • mysql中join的作用是什么
    这篇文章主要介绍“mysql中join的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql中join的作用是什么”文章能帮助大家解决问题。 ...
    99+
    2022-11-30
    mysql join
  • mysql中match的作用是什么
    在MySQL中,MATCH是一种全文搜索的函数。它用于在一个表的一个或多个文本列中搜索一个指定的字符串。MATCH函数可以按照某种算...
    99+
    2024-04-09
    mysql
  • mysql中optimize的作用是什么
    在MySQL中,OPTIMIZE命令用于优化数据库表结构,以提高查询性能和减少存储空间的占用。当表中有大量的删除和更新操作时,表中会...
    99+
    2024-04-09
    mysql
  • MySQL中administrator的作用是什么
    在MySQL中,administrator(管理员)是指拥有最高权限的用户,拥有对数据库服务器进行管理和配置的权限。管理员通常拥有对...
    99+
    2024-04-09
    MySQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作