索引下推 (ICP) 是 MySQL 5.6 引入的存儲引擎層優化,將部分 WHERE 條件下推至存儲引擎內部過濾,減少回表次數,顯著提升範圍查詢效能。本文對比無 ICP 與有 ICP 的掃描流程,並以實例演示效果。
CREATE TABLE people (
id INT PRIMARY KEY,
zipcode VARCHAR(10),
lastname VARCHAR(50),
firstname VARCHAR(50),
address VARCHAR(200),
INDEX idx_zip_ln_fn (zipcode, lastname, firstname)
) ENGINE=InnoDB;
SELECT * FROM people WHERE zipcode = '95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';
zipcode='95054' 定位索引範圍lastname LIKE '%etrunia%' 和 address LIKE '%Main Street%'zipcode='95054' 定位索引範圍lastname LIKE '%etrunia%' (lastname 在索引中)address LIKE '%Main Street%' (address 不在索引)| 條件 | 說明 |
|---|---|
| 存儲引擎支援 | InnoDB、MyISAM (5.6+) |
| 索引類型 | 二級索引 (非主鍵) |
| 查詢類型 | range、ref、eq_ref、ref_or_null |
| 下推條件 | 僅引用索引列,且可在存儲引擎評估 |
| 不支援 | 全表掃描、主鍵查詢、子查詢、觸發器、外鍵檢查 |
EXPLAIN SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%'; # 輸出 Extra 欄顯示 "Using index condition" 表示 ICP 生效
EXPLAIN 確認 Using index conditionICP + MRR (Multi-Range Read) 進一步優化範圍掃描ICP 是「將計算推向數據」思想在存儲引擎層的經典實踐。合理設計索引與查詢,讓 ICP 最大化發揮作用,是 SQL 調優的必修課。