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';