在High Performance MySQL一书中专门有叙述,名为Avoiding Multiple Range Conditions,在复合索引里,仅仅只能保存一个range类型的查询字段,并且要放到复合索引的末尾,否则,range类型查询字段后面的索引无效。详细的介绍大家可以自己查阅。
最近在mysql5.6的文档中读到 8.2.1.6 Index Condition Pushdown Optimization。
ICP( Index Condition Pushdown)的原理简单说来就是将可以利用索引筛选的where条件在存储引擎一侧进行筛选,而不是将所有index access的结果取出放在server端进行where筛选。
关闭ICP
在不支持ICP的系统下,索引仅仅作为data access使用。
开启ICP
在ICP优化开启时,在存储引擎端首先用索引过滤可以过滤的where条件,然后再用索引做data access,被index condition过滤掉的数据不必读取,也不会返回server端。
需要注意的是:ICP只能用于二级索引,不能用于主索引。