一. 索引下推概述ICP 全称 Index Condition Pushdown是MySQL5.6之后的一个新特性它是一种在存储引擎层使用索引过滤数据的一种优化方式。二. 索引下推举例下面是数据库的一张 employees 员工表表中有诸多字段然后我给 department_id 部门id和 salary 薪水字段添加一个联合索引departmend_id 排第一位salary 排第二位然后利用这个联合索引做一次条件查询。1查询语句如下EXPLAIN SELECT * FROM employees WHERE department_id 50 AND salary 8000;可以看到查询条件中使用到了 department_id 和 salary所以优化器会选择使用联合索引查询2首先第一个过滤条件 department_id 50可以通过索引快速查询但是使用到了 会导致联合索引后面的索引字段失效即 salary 再进行判断的时候会进行全表扫描不能走索引联合索引只有 department_id 生效3假如说数据库查询到了 department_id 的数据一共有十条那么正常来讲这十条数据会全部进行回表查询查询到十条数据之后再判断第二个过滤条件 salary4但是数据库优化器会进一步采取索引下推在这十条数据回表之前先在引擎层对这十条数据后一个过滤条件 salary 8000 做判断这样一来就有可能会再次过滤一些不满足条件的记录我们假设过滤之后剩下五条记录那么就只需要进行5次回表查询将回表查询次数减少提高了数据库查询效率使用 explain 执行计划输出查询详细信息得出如下结果可以发现再 Extra 额外信息行显示 Using index conditionUsing whereUsing index condition 就表示用到了索引下推索引下推通常应用于联合索引中三. ICP 的主要作用对于InnoDB存储引擎来说索引下推主要是减少回表查询的次数降低数据库的IO消耗因为回表查询是一种随机IO的行为在回表之前减少回表次数就可以降低数据库的随机IO资源消耗ICP不仅可以应用于InnoDB存储引擎也可以应用于MyISAM存储引擎