1. 功能的出现&目的
MySQL5.6版本开始支持MRR优化。主要目的是为了减少对磁盘的随机访问,将其转化为较为顺序的数据访问。适用于range
,ref
,eq_ref
类型的查询。
2.好处
- 使数据访问变得较为顺序。
- 辅助索引查询得到书签后,先对主键进行排序,再按序进行查找
- 减少缓冲池中页被替换的次数
- 批量处理对键值的查询操作
3. 具体操作步骤如下
- 先把查询到的辅助索引键值放在缓存中(此时是自然的按照辅助索引键值排序的)
- 将这些键值按照主键进行排序
- 将排序后的主键使用聚集索引查找
- 此外,如果缓冲池不够大,在查找某一条时,读进该页,这页会很快被移出缓冲池。如果查找是没有顺序的,可能这页被移除后,很快又要被读进来。这样对同一页反复移入移出,会有很大的消耗。而如果查找是有顺序的,将会极大地避免这种情况。
4.示例
MRR还可以将某些范围查询,拆分为键值对,以此来进行批量数据查询。这样可以在拆分过程中,直接过滤掉一些不符合查询条件的数据。例如:
SELECT * FROM t WHERE a>=1000 AND a<2000 AND b =1000;
表中建有(a,b)的联合索引。如果没有MRR优化,优化器将会先把满足a>=1000 AND a<2000的所有数据取出,待到取出完后再根据 b =1000的条件进行过滤。这样会使很多无用数据被取出,如果无用数据数量很多,将会浪费很多时间。
启用了MRR优化后,优化器先将查询条件拆分,(1000,1000)(1001,1000)(1002,1000)……根据这些条件进行查询,这样取出的数据就都是有用的数据了。