首页/数据/SQL 速查/索引条件下推 ICP
性能与执行计划72 条

索引条件下推 ICP

MySQL 5.6+ 把部分 WHERE 条件下推到存储引擎、在索引层先过滤(Extra: Using index condition),减少回表次数。

SQL 速查数据更新于 2026-10-12

示例

示例
ALTER TABLE orders ADD INDEX idx_user_status_created (user_id, status, created_at);

EXPLAIN SELECT * FROM orders
WHERE user_id = 100 AND status LIKE 'p%' AND created_at > '2024-01-01';
-- Extra: Using index condition
-- 索引先用 user_id 定位,再用索引中的 status/created_at 过滤,最后才对命中行回表
效果不符合条件的行在索引层被滤掉,减少随机回表
代价存储引擎读取索引条目本身有少量额外开销
开关optimizer_switch 中 index_condition_pushdown 控制;默认开启
ICP 只能过滤索引中已有的列;SELECT 里需要的其他列仍要走回表。

易错点

  • 把 Using index condition 当覆盖索引:它只表示过滤下推,回表仍可能发生
  • 为 ICP 盲目加宽索引:过滤列加多了索引体积与维护成本上升,按查询模式权衡

数据来源与参考

  • MySQL 8.0 Reference Manual §8.2.1.6 Index Condition Pushdown Optimization
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌