MySQL8中文手册-MRR优化

网上充斥着各种MySQL的学习资料,有所谓的小白学习笔记也有大牛的分享文章,有免费的也有收费的,文章的质量也是鱼龙混杂,经常看到文章与文章之间相互矛盾,甚至文章前后矛盾。
至于为什么要翻译官方文档,还要源于上次学习极客时间的付费文章,其中一篇对change buffer的说明,文章中描述change buffer是用于更新数据缓存,后面又对change buffer和redo log的关系进行了说明,然而评论中有各种观点,有些说change buffer只针对索引数据进行缓存,文章前后翻了好几遍,始终有个疑问,change buffer到底缓存的是什么内容?在度娘上查找,也是各种说法都有。

为了彻底弄明白这个问题,我去查找了MySQL8的官方英文文档,发现文档中描述非常清楚,change buffer的缓存对象是非唯一二级索引,缓存的是二级索引的变更操作(insert、update、delete),前面的一切疑问都明白了。

经过这件事后,我开始翻译MySQL8的使用手册,这才是最权威的最值得参考的资料,翻译过程参考了百度和谷歌翻译,但大部分还是人工翻译,因此难免有些理解偏差,请大家及时指正。

更多内容请点击MySQL8中文手册

8.2.1.11 MRR(多区间读)优化

当查询语句使用的是普通索引字段的区间查询条件时,从索引上读取到符合条件的值的列表后,需要根据主键进行回表读操作,如果表数据量很大或表数据没有在引擎的缓存上保存,可能会导致大量的磁盘随机读。这种情况下,MySQL会使用MRR优化来尽量减少磁盘随机读,在扫描索引时,读取符合条件的主键值,并将主键值进行缓存,经过排序后,再按顺序回表读取表数据。MRR设计的主要目标是通过顺序回表读取数据,以减少磁盘随机访问。

使用MRR优化主要有以下好处:

  • MRR允许基于索引数据按顺序访问行数据,而不是随机访问。MySQL读取符合查询条件的索引集合,并根据主键ID进行排序,然后使用排好序的索引从主键索引上读取数据。这样使数据访问更加高效。

  • 使用MRR,在使用索引获取行数据时,可以批量处理索引访问请求,比如查询的是索引的范围,或使用索引进行equi-join查询。MRR在索引上进行顺序迭代查询来获取符合条件的索引元数据,查询到的索引数据累积后,使用这些索引回表读取需要的数据行。在开始回表读取数据行之前,并不一定要获取所有的索引元数据。

MRR优化不支持在虚拟列上创建的二级索引。InnoDB支持虚拟列的二级索引。

以下的这些场景下,MRR优化是非常有优势的:
场景A:MRR可以用在InnoDB或MyISAM表的使用索引进行的范围查询和equi-join操作情况下。

  1. 一段索引数据读到缓存中。
  2. 缓存中的索引数据根据主键ID进行了排序。
  3. 使用排好序的索引从表中读取行数据。

场景B:MRR可以用在NDB表的多范围查询索引或者进行equi-join查询时。

  1. 一段索引数据读到中心节点的缓存中。
  2. 缓存中的索引发送到执行节点读取行数据。
  3. 查询到的行数据打包发回中心节点。
  4. 接收到的数据包解析出来放入缓存。
  5. 从缓存中把数据读走。

如果语句执行过程使用了MRR,在EXPLAIN的Extra列中会显示Using MRR。
InnoDB和MyISAM引擎在查询数据时不需要回表的情况下,不会使用MRR优化。例如查询的数据可以直接使用索引数据就能满足(使用覆盖索引),这样MRR就无法进行优化了。

两个optimizer_switch中的参数可以配置MRR。mrr参数用来配置MRR是否开启。如果mrr=on,mrr_cost_based参数可以控制优化器是否以查询代价作为判断依据来决定是否使用MRR,即使在mrr=off的情况下也会尽可能的使用MRR。默认情况下mrr=on,mrr_cost_based=on,详细信息请参考:Section 8.9.2, “Switchable Optimizations”.

对于MRR,数据库引擎以read_rnd_buffer_size参数为依据来确定分配给MRR使用的内存大小。引擎使用缓存的最大值为read_rnd_buffer_size字节,根据这个参数来判断单次可以处理的索引数据多少。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值