Multi-Range-Read(MRR)
官网文档:https://dev.mysql.com/doc/refman/8.0/en/mrr-optimization.html
优化背景:MRR优化主要是需要减少随机访问磁盘的次数,对于使用辅助索引的 explain type range 的场景。
下面orders 表我建了 order_status ,create_time 的联合索引
正常执行显示
执行下面脚本,开启MRR
## 查询sql的优化参数
select @@optimizer_switch;
set @@optimizer_switch='mrr_cost_based=off,mrr=on';
可以很明显的看到 使用了MRR
总结
使用MRR在数据没有预热的情况下,可以很大程度的提升范围查询的性能,我们都知道mysql的索引和数据是组合在一起的就是聚族索引,辅助索引的叶子节点就是主键ID,mysql一般都是先从辅助索引中查询主键ID,在回表查询具体的行数据,如果不适用MRR优化的话,需要一个个主键无序的查询具体的数据,会导致数据的page页重复请求,会有在同一个page中的数据,因为没有连续请求可能会导致对同一个page发送多次系统IO把数据读到内存中,内存会有LRU算法淘汰page页。
开启MRR优化后,会先对辅助索引查询的主键ID进行排序,就可以减少磁盘请求,因为page页已经在内存中,这种情况在mysql没有预热的情况比较明显