MRR(Muti-Range Read)
MRR可以将随机读转为较为顺序的数据访问,从而有效减少随机访问。
在查询辅助索引时,先根据得到的查询结果,按主键顺序进行书签查找。
我们知道,当查询需要读取整行信息时,如果使用辅助索引,那么得到结果后还需要通过书签通过主键获取整行信息。而辅助索引的顺序和主键的顺序可能不一样,这样就导致读取主键数据时为随机读。由于随机读效率较低,在数据较多时,优化器会放弃使用辅助索引,而直接使用主键。
MRR有效的缓解了这一问题。
MRR还可以将一个范围查询拆分为键值对条件,在拆分的过程中过滤掉不符合的数据。
例如:
select * from t where a>=1000 and a<2000 and b=5000;
表t有联合索引(a,b),优化器将条件拆分为(1000,5000),(1001,5000)...(1999,5000)
当启用了MRR特性时,优化器优化结果extra中会出现“Using MRR”
ICP优化(Index Condition Pushdown)
这个特性让MySQL在取出索引的同时,判断是否可以进行where条件过滤,即在存储引擎中过滤操作。
当启用了ICP优化,优化器优化结果extra中会出现“Using index condition”
当然,过滤必须是索引可以覆盖到的范围。