每天一个mysql 的小知识--MRR优化

Multi-Range-Read(MRR)

官网文档:https://dev.mysql.com/doc/refman/8.0/en/mrr-optimization.html

image.png

优化背景:MRR优化主要是需要减少随机访问磁盘的次数,对于使用辅助索引的 explain type range 的场景。

下面orders 表我建了 order_status ,create_time 的联合索引
正常执行显示

image.png

执行下面脚本,开启MRR

## 查询sql的优化参数
select @@optimizer_switch;

set @@optimizer_switch='mrr_cost_based=off,mrr=on';
image.png

可以很明显的看到 使用了MRR

总结

使用MRR在数据没有预热的情况下,可以很大程度的提升范围查询的性能,我们都知道mysql的索引和数据是组合在一起的就是聚族索引,辅助索引的叶子节点就是主键ID,mysql一般都是先从辅助索引中查询主键ID,在回表查询具体的行数据,如果不适用MRR优化的话,需要一个个主键无序的查询具体的数据,会导致数据的page页重复请求,会有在同一个page中的数据,因为没有连续请求可能会导致对同一个page发送多次系统IO把数据读到内存中,内存会有LRU算法淘汰page页。

开启MRR优化后,会先对辅助索引查询的主键ID进行排序,就可以减少磁盘请求,因为page页已经在内存中,这种情况在mysql没有预热的情况比较明显

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。