MySQL 知识-- MRR 优化
本文最后更新于:10 天前
Multi-Range Read (MRR)
-
目的:通过将随机 IO 排序,优化为顺序 IO 减少磁盘随机访问
-
命令:
set optimizer_switch='mrr=on';
-
适用条件: explain 的 type 为 range,ref,eq_ref 类型的查询,extra 会显示 using MRR
-
好处:
-
MRR使辅助索引的回表访问变得较为顺序
在辅助索引中,首先根据得到的查询结果按照主键升序排序,再去回表查找
这样的好处是:
-
磁盘和磁头不再需要来回做机械运动
-
可以充分利用磁盘预读
可以把后面可能用到的数据预先读出来
-
在一次查询中,每一页的数据只会从磁盘读取一次
即减少缓冲池中页被替换的次数,每次用完就不会重复再加载进来了
-
-
批量处理对键值的查询操作
-
此外,MRR 还可以将某些范围查询,拆分为键值对,以此来进行批量数据查询
好处是在拆分过程中,直接过滤一些不符合查询条件的数据,保证取出的都是有效的数据,而不会直接先根据一个条件取数据,然后再根据第二个条件进一步过滤
-
-
工作方式(InnoDB 和 MyISAM):
-
优化器将二级索引查询到的记录放到一块缓冲区中,这时数据是根据二级键值排序的
-
如果二级索引扫描到文件的末尾或者缓冲区已满,则使用快速排序对缓冲区中的内容按照主键进行排序
-
用户线程调用 MRR 接口取 cluster index,然后根据 cluster index 取行数据
-
当根据缓冲区中的 cluster index 取完数据,则继续调用上述过程,直至扫描结束
-
本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 。转载请注明出处!