MySQL机制介绍之ICP

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

  1. 用二级索引查找数据的主键
  2. 用主键回表读取完整的行记录
  3. 引擎层利用where语句的条件对行记录进行过滤

使用ICP

  1. 用二级索引查找数据的主键
  2. 如果where条件中的字段在复合索引中,引擎层对where条件里的字段进行过滤后,返回主键
  3. 利用主键回表读取完整的行记录
  4. 引擎层用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