MRR与ICP优化

mysql5.6对于辅助索引的查询进行了优化

MRR(Multi-Range Read)

优化点

把离散的随机io优化成连续io,以降低查询过程中的io开销

原理导读

以innodb引擎为例,传统的mysql在使用辅助索引时,有以下三个步骤:

1、 通过索引页的叶子节点找到对应的主键id
2、 通过主键id找到对应的数据页
3、在数据页中通过二分查找找到对应的记录。

一般where后的查询结果肯定不只是单条记录,获取到若干主键id回表查询时,非顺序的数据必然会导致很多次的随机io,随机io带来的消耗实在是让人无法接受。mrr的步骤如下:

1、将查询的到的辅助索引键值存放于缓存中,此时数据是按照辅助索引有序的
2、把数据按照主键id进行排序
3、根据主键id的排序顺序来访问实际的数据文件

对比可知,mrr只是在回表查询数据之前,提前把数据按照主键id排序,使得随机io转换成顺序io,同时能偶降低因为存储引擎缓存不够大时(不能存放全表数据),频繁的离散读导致缓存中的页被频繁置换带来的io开销。

适用范畴

mrr适合使用在range查询,5.6默认是开启的。

SET @@optimizer_switch = 'mrr=on,mrr_cost_based=off';

验证

你可能感兴趣的:(MRR与ICP优化)