Using index condition 不代表真的少回表了
索引下推(ICP,5.6 起)的意思是:在二级索引的叶子上,先用索引里已有的列判断一遍,不满足的就不回表。
但 EXPLAIN 里看到 Using index condition,不等于真省了回表。用 (name, age) 索引、10 万行数据试了两条:
-- 1. name 和 age 都用来定扫描起止
SELECT * FROM tuser WHERE name = '张1' AND age > 30;
-- 2. 只有 name 能定起止,age 只能过滤
SELECT * FROM tuser WHERE name LIKE '张1%' AND age = 10;分别开关 optimizer_switch='index_condition_pushdown=on/off',看 InnoDB 交给 Server 的行数:
| 查询 | ICP 开 | ICP 关 |
|---|---|---|
| 1 | 6 | 6 |
| 2 | 375 | 22213 |
第 1 条扫到的每一行本来就满足条件,下推的判断次次为真,一行都没省。第 2 条里 age 定不了范围,下推才真正在叶子上丢掉了 2 万多行。
另外,不在这棵索引里的列(比如 gender)推不下去,只能回表后再判断。