索引下推(ICP)是MySQL 5.6起引入的优化机制,将WHERE中可由索引字段判断的条件下推至存储引擎层过滤,减少无效回表和I/O。
索引下推(Index Condition Pushdown,简称 ICP)是 MySQL 5.6 起引入的关键查询优化机制,它的核心作用是把 WHERE 条件中**能用索引字段判断的部分**,从 Server 层“下推”到存储引擎层执行过滤,从而大幅减少无效回表和数据传输。
没有 ICP 时,查询流程是线性的:存储引擎先按索引条件查出一批索引项 → 全部回表取完整行 → 再由 Server 层逐行应用剩余 WHERE 条件过滤。这会导
致大量无意义的磁盘 I/O 和内存开销,尤其当索引匹配范围大、但后续条件过滤性强时(比如 name LIKE '李%' 匹配几千条,而 age = 11 实际只命中几条)。
ICP 把部分条件“提前拦截”在索引扫描阶段,只要索引项里已包含所需字段值(如联合索引中的非前缀列),存储引擎就能当场判断是否满足条件,不满足就跳过回表。
不是所有带索引的查询都能启用 ICP,必须同时满足:
>、、BETWEEN、LIKE 'abc%')
SELECT 字段全在索引中,走覆盖索引,ICP 不生效)optimizer_switch 中 index_condition_pushdown=on(默认开启)执行 EXPLAIN 查看执行计划,重点观察 Extra 列:
%xxx 等),需 Server 层兜底处理ICP 的收益高度依赖索引设计与查询写法:
(status, create_time, amount) 支持 WHERE status = 1 AND create_time > '2025-01-01' 下推)WHERE YEAR(create_time) = 2025 会断掉索引利用,ICP 也失效)'abc%' 可下推;'%abc' 或 '%abc%' 无法利用索引排序,ICP 不参与)gender = 'M' 占 49%),即使下推也节省不了多少回表,优化价值有限