- 使用前后的成本差别:
使用前,存储层多返回了需要被index filter过滤掉的整行记录 。
使用ICP后,直接就去掉了不满足index filter条件的记录,省去了他们回表和传递到server层的成本。 ICP的 加速效果 取决于在存储引擎内通过 ICP筛选 掉的数据的比例。
使用ICP减少回表次数,只用到了zipcode索引,但还是会先过滤lastname,再去回表。index(zipcode,lastname,firstname)SELECT * FROM peopleWHERE zipcode = '001'AND lastname like '%张%'AND address like '%北京市%'
- ICP的使用条件
① 只能用于二级索引(secondary index)
② explain显示的执行计划中type值(join 类型)为range、ref、eq_ref或者ref_or_null。
③ 并非全部where条件都可以用ICP筛选,如果where条件的字段不在索引列中,还是要读取整表的记录到server端做where过滤。
④ ICP可以用于MyISAM和InnnoDB存储引擎
⑤ MySQL 5.6版本的不支持分区表的ICP功能,5.7版本的开始支持。
⑥ 当SQL使用覆盖索引时,不支持ICP优化方法。
