Index Condition Pushdown

  • Index Condition Pushdown,即索引下推(ICP),是针对应用索引查问策略的优化
  • 不开启索引下推时,MySQL通过存储引擎遍历索引,定位数据返回给服务器,再由服务器进行Where条件的判断
  • 开启索引下推,且某一部分的WHERE条件能够应用索引中的列来判断时,服务器会将这部分Where条件下推到存储引擎,由存储引擎应用索引判断
  • 索引下推能够缩小存储引擎拜访数据表的次数,以及MySQL服务器拜访存储引擎的次数

实用条件

  1. 须要整表扫描的状况,如range, ref, eq_ref, ref_or_null,实用于InnoDB和MyISAM引擎(5.7版本后能够用于分区表查问)
  2. 对于InnoDB只实用于二级索引,因为InnDB的聚簇索引会将整行数据读到InnDB的缓冲区,这样无奈缩小IO次数,失去了优化的意义
  3. 援用子查问的条件不能下推
  4. 调用存储过程的条件不能下推,存储引擎无奈调用位于MySQL服务器中的存储过程
  5. 触发条件不能下推

相干示例

此处翻译官网文档,假设有一张人员信息表,并定义联结索引(zipcode,lastname,firstname),此时运行如下查问

SELECT * FROM peopleWHERE zipcode='95054'AND lastname LIKE '%etrunia%'AND address LIKE '%Main Street%';
  • 若没有应用索引下推,存储引擎会从索引中匹配zipcode='95054'的行返回至服务器,由服务器来判断lastname LIKE '%etrunia%'和address LIKE '%Main Street%'
  • 若应用索引下推,存储引擎会在索引中判断是否合乎lastname LIKE '%etrunia%'和address LIKE '%Main Street%',仅返回匹配的行至服务器

相干配置

SET optimizer_switch = 'index_condition_pushdown=off';SET optimizer_switch = 'index_condition_pushdown=on';

集体思考

能够将索引下推了解为,在遍历索引时携带该索引反对的列查问条件,在索引中实现数据过滤,这样能够缩小查问的整体交互次数,晋升性能