高 进阶
索引下推ICP#
一句话答案#
Index Condition Pushdown 在索引层直接过滤不满足条件的记录,减少回表次数,MySQL 5.6+ 默认开启。
核心要点
原理: 联合索引 (a,b,c),查询 WHERE a=1 AND c=3
- 无ICP: 用 a=1 回表所有记录,Server层再过滤 c=3
- 有ICP: 在索引层同时检查 c=3,只回表满足条件的记录
效果: 减少回表 IO,MySQL 5.6+ 默认开启
面试回答(2分钟版)
Index Condition Pushdown 是 MySQL 5.6 引入的优化,默认开启。它的作用是在存储引擎层利用索引中已有的列提前过滤记录,减少不必要的回表。举个例子,联合索引 (a,b,c) 查询 WHERE a=1 AND c=3,没有 ICP 时引擎只能用 a=1 定位记录然后全部回表,由 Server 层再过滤 c=3;有了 ICP,引擎在索引层就能同时检查 c=3 这个条件,不满足的直接跳过不回表,大幅减少了随机 IO。判断 ICP 是否生效看 EXPLAIN 的 Extra 列,显示 Using index condition 就说明生效了。要注意区分 Using index(覆盖索引完全不回表)和 Using index condition(ICP 减少回表),两者是不同的优化层次。ICP 对联合索引中不满足最左前缀但列值存在于索引中的条件特别有效。
追问与易错
追问方向:
- “ICP 开启前后区别?”→ 无 ICP 时引擎只用索引前缀列过滤后全部回表,由 Server 层再过滤剩余条件;有 ICP 时引擎在索引层就检查索引中包含的其他列条件,不满足的直接跳过不回表,减少随机 IO
- “哪些场景 ICP 无法生效?”→ 覆盖索引查询(本身不需要回表所以 ICP 无意义)、主键索引查询(聚簇索引叶子已有完整行)、子查询条件、以及条件列不在索引中的情况
- “怎么验证 ICP 生效?”→ EXPLAIN 查看 Extra 列,显示 Using index condition 表示 ICP 生效;区别于 Using index(覆盖索引)和 Using where(Server 层过滤)
易错点:
- ❌ ICP 能让所有查询走索引——只是多过滤一步
- ❌ 混淆 Using index 和 Using index condition