索引范围扫描为何触发Using index condition?已创建对应索引仍出现该问题
问题解答
首先明确:Using index condition是MySQL**索引条件下推(ICP)**的标识,这不是索引没生效的表现,反而是基于idx_price索引做的优化行为。
出现这个标识的核心原因,是你忽略了二级索引的结构和查询的字段需求:
- 你的
idx_price是仅包含price字段的二级索引,而二级索引的叶子节点会自动附带聚簇键id,所以通过它能过滤出符合price < 20000的id; - 但查询需要的
name字段不在idx_price索引中,数据库原本需要先过滤出符合条件的id,再回表到聚簇索引取name。ICP的作用是把price < 20000的过滤逻辑提前到存储引擎层执行,减少需要回表的记录数,因此执行计划会显示Using index condition。
如果想消除这个标识并避免回表,你可以把name加入到idx_price中,创建覆盖索引:
CREATE INDEX idx_price_name ON product(price, name);
此时执行select id , name from product where price < 20000,执行计划的Extra会变为Using index(覆盖索引扫描,无需回表),也就不会出现Using index condition了。
内容的提问来源于stack exchange,提问作者tray
相关产品推荐
相关产品推荐

