8.2.1.10 多范围读取优化

当 table 较大且未存储在存储引擎的高速缓存中时,在辅助索引上使用范围扫描来读取行会导致对 table 的许多随机磁盘访问。通过磁盘扫描多范围读取(MRR)优化,MySQL 尝试通过首先仅扫描索引并收集相关行的键来减少用于范围扫描的随机磁盘访问次数。然后对键进行排序,最后使用主键的 Sequences 从基 table 中检索行。磁盘扫描 MRR 的动机是减少随机磁盘访问的次数,而是对基 table 数据进行更 Sequences 的扫描。

多范围读取优化具有以下优点:

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

以下方案说明了 MRR 优化何时可以发挥优势:

方案 A:MRR 可用于InnoDBMyISAMtable,以进行索引范围扫描和等联接操作。

方案 B:MRR 可用于NDBtable 以进行多范围索引扫描,或在通过属性执行均等联接时使用。

使用 MRR 时,EXPLAIN输出中的Extra列显示Using MRR

如果不需要访问完整 table 行以产生查询结果,则InnoDBMyISAM不使用 MRR。如果可以完全基于索引 Tuples 中的信息(通过covering index)产生结果,则为这种情况; MRR 没有任何好处。

两个optimizer_switch系统变量标志提供了使用 MRR 优化的接口。 mrr标志控制是否启用 MRR。如果启用了mrr(on),则mrr_cost_based标志控制优化器是尝试在使用还是不使用 MRR(on)之间做出基于成本的选择,还是在可能的情况下(off)使用 MRR。默认情况下,mrronmrr_cost_basedon。参见第 8.9.2 节“可切换的优化”

对于 MRR,存储引擎使用read_rnd_buffer_size系统变量的值作为可为其缓冲区分配多少内存的准则。引擎最多使用read_rnd_buffer_size个字节,并确定一次处理要处理的范围数。

首页