ZVVQ代理分享网

MRR的内部工作原理,你知道吗?

作者:zvvq博客网
导读本文将深入探讨MRR的内部工作原理,以及如何有效地应用于日常数据库管理中。MRR启用后,MySQL会先按索引扫描记录,但不会立即获取行数据,而是将每个需要访问的行位置(如主键)保存

在探索数据库优化的广阔领域,我们不可避免地会遇到一系列独特的概念和技术。其中之一是MySQL的多范围阅读。(Multi-RangeRead,MRR)。

这项技术为我们在处理大量数据时提供了提高查询效率的有力手段。通过改变数据检索顺序,利用操作系统缓存进行预读,可以显著减少I/O操作数量,提高查询速度。本文将探讨MRR的内部工作原理,以及如何有效地应用于日常数据库管理中。

MRR是什么?

在查询过程中,MRR是优化器将随机IO转换为顺序IO以降低IO费用的一种手段。

在了解MRR之前,我们先来了解一下。「回表」。

回表是MySQL在进行查询时的一个步骤,它通常发生在使用索引进行搜索之后。当MySQL在索引中找到所需的数据时,MySQL需要回到主表中获取完整的行数据,而这些数据并没有完全满足查询需求(例如,索引不包括所有所需的列)。这个过程被称为“回表”。

例如,如果查询句子中的一些列没有包含在索引中,那么即使你能从索引中找到一些信息,你也需要回到原始列来获取其他列的信息。这就是所谓的“回表”操作。为了提高查询效率,我们可以尽量减少回表操作,例如使用它「覆盖索引(CoveringIndex)」。

我们知道二级索引有一个返回表的过程。由于二级索引中引用的主键值不一定有序,可能会导致大量的随机IO。如果在返回表之前将主键值排列在内存中,则可以在返回表时使用顺序IO来代替原始的随机IO。

如果没有MRR,MySQL将按照索引顺序访问行数据,而索引顺序不一定与磁盘上的物理存储顺序一致,因此可能会产生大量的随机磁盘I/O。

MRR启用后,MySQL会先按索引扫描记录,但不会立即获取行数据,而是将每个需要访问的行位置(如主键)保存到一个缓冲区域。

然后,MySQL会按照物理存储的顺序(通常是主键顺序)按照这些行位置获取行数据。这样可以避免大量的随机I/O,由于数据现在是按照它们在磁盘上的物理存储顺序访问的。