MySQL 知识-- MRR 优化

本文最后更新于:10 天前

Multi-Range Read (MRR)

  • 目的:通过将随机 IO 排序,优化为顺序 IO 减少磁盘随机访问

  • 命令: set optimizer_switch='mrr=on';

  • 适用条件: explain 的 type 为 range,ref,eq_ref 类型的查询,extra 会显示 using MRR

  • 好处:

    1. MRR使辅助索引的回表访问变得较为顺序

      辅助索引中,首先根据得到的查询结果按照主键升序排序,再去回表查找

      这样的好处是:

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

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

        可以把后面可能用到的数据预先读出来

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

        即减少缓冲池中页被替换的次数,每次用完就不会重复再加载进来了

    2. 批量处理对键值的查询操作

    3. 此外,MRR 还可以将某些范围查询,拆分为键值对,以此来进行批量数据查询

      好处是在拆分过程中,直接过滤一些不符合查询条件的数据,保证取出的都是有效的数据,而不会直接先根据一个条件取数据,然后再根据第二个条件进一步过滤

  • 工作方式(InnoDB 和 MyISAM):

    1. 优化器将二级索引查询到的记录放到一块缓冲区中,这时数据是根据二级键值排序的

    2. 如果二级索引扫描到文件的末尾或者缓冲区已满,则使用快速排序对缓冲区中的内容按照主键进行排序

    3. 用户线程调用 MRR 接口取 cluster index,然后根据 cluster index 取行数据

    4. 当根据缓冲区中的 cluster index 取完数据,则继续调用上述过程,直至扫描结束