MySQL

Using index condition 不代表真的少回表了

索引下推(ICP,5.6 起)的意思是:在二级索引的叶子上,先用索引里已有的列判断一遍,不满足的就不回表。

但 EXPLAIN 里看到 Using index condition,不等于真省了回表。用 (name, age) 索引、10 万行数据试了两条:

sql
-- 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 关
166
237522213

第 1 条扫到的每一行本来就满足条件,下推的判断次次为真,一行都没省。第 2 条里 age 定不了范围,下推才真正在叶子上丢掉了 2 万多行。

另外,不在这棵索引里的列(比如 gender)推不下去,只能回表后再判断。

esc