MRR ( Multi-Range Read ),目的是减少磁盘随机访问,将随机访问转化为较为顺序的访问。
当表很大并且未存储在存储引擎的缓存中时,使用二级索引上的范围扫描读取行可能会导致对基表的许多随机磁盘访问。借助磁盘扫描多范围读取 (MRR) 优化,MySQL 尝试通过首先仅扫描索引并收集相关行的键来减少范围扫描的随机磁盘访问次数。然后对键进行排序,最后使用主键的顺序从基表中检索行。Disk-sweep MRR 的动机是减少随机磁盘访问的次数,而是实现对基表数据的更顺序扫描。
多范围读取优化提供了以下好处:
-
MRR 允许基于索引元组按顺序访问数据行,而不是按随机顺序访问。服务器获取一组满足查询条件的索引元组,按照数据行ID顺序进行排序,并使用排序后的元组按顺序检索数据行。这使得数据访问更高效且成本更低。
-
MRR 支持对需要通过索引元组访问数据行的操作的键访问请求进行批处理,例如范围索引扫描和使用索引作为连接属性的等连接。MRR 遍历一系列索引范围以获得合格的索引元组。随着这些结果的累积,它们用于访问相应的数据行。在开始读取数据行之前不必获取所有索引元组。
开启参数
mrr_cost_based
性能参数
read_rnd_buffer_size