ICP是什么
Index Condition Pushdown,也称为索引条件下推,体现在执行计划中会出现Using index condition
。
ICP优化适用于MySQL利用索引从表里检索数据的场景。
使用命令set optimizer_switch='index_condition_pushdown=on'
开启
使用场景
- 索引访问方式是range/ref/eq_ref/ref_or_null,并且需要访问表的完整行记录
- InnoDB和MYISAM表,包括分区的表(5.7)
- 对于InnoDB表,ICP只适用于二级索引。ICP的目标是减少访问表的完整行的读取量从而减少IO操作。
- 不支持建立在虚拟列上的二级索引
- 引用子查询、存储函数的条件没法下推
- Triggered conditions 也没法下推
原理
不使用ICP
- 用二级索引查找数据的主键
- 用主键回表读取完整的行记录
- 引擎层利用where语句的条件对行记录进行过滤
使用ICP
- 用二级索引查找数据的主键
- 如果where条件中的字段在复合索引中,引擎层对where条件里的字段进行过滤后,返回主键
- 利用主键回表读取完整的行记录
- 引擎层用where语句的剩余条件对行记录进行过滤
结论
ICP的优化在引擎层就能够过滤掉大量的数据,这样无疑能够减少了对base table和mysql server的访问次数,提升了性能。
https://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html
https://yq.aliyun.com/articles/259696
https://zhuanlan.zhihu.com/p/73035620