Index Condition Pushdown 是 MySQL 5.6 引入的存儲引擎層過濾優化。傳統模式下,引擎層按索引讀取行後,將整行傳回 Server 層再做 WHERE 過濾。ICP 將部分 WHERE 條件「下推」到引擎層,利用索引列直接過濾,**減少回表次數與跨層數據傳輸**。
環境:MySQL 5.6.16,關閉 Query Cache。
索引:idx_name (first_name, last_name)。
查詢:SELECT * FROM employees WHERE first_name='Anneke' AND last_name LIKE '%sig';
| 狀態 | Duration (Sending data) | CPU (Sending data) |
|---|---|---|
| ICP ON | 0.000189 s | 0.000000 |
| ICP OFF | 0.000735 s | 0.001000 |
Sending data 階段耗時降低 74%,CPU 佔用歸零。ICP 在引擎層用 first_name 精確匹配 + last_name 前綴過濾(雖 LIKE '%sig' 不能用索引,但引擎層仍可比較索引中存儲的 last_name 值),大幅減少回表與網絡往返。
range、ref、eq_ref、ref_or_null 存取類型。fulltext 索引。RAND())。optimizer_switch='index_condition_pushdown=off' 可關閉。Using index condition 即確認生效。mrr=on (Multi-Range Read) 進一步優化磁碟順序讀取。Handler_icp_attempts / Handler_icp_match 狀態變量評估效果。