MySQL Explain中ref=const,const含义及执行计划相关疑问
问题核心原因
你遇到的情况是因为联合索引的两个列都用了等值常量匹配,MySQL优化器可以直接通过索引定位到唯一数据行;如果查询的列都包含在索引中(覆盖索引),就会触发Using index。而Using index condition(ICP)是针对索引列存在范围条件、需要存储引擎层提前过滤的场景,这里完全不需要,所以不会出现。
ref=const,const的工作原理
ref列表示MySQL匹配索引时的关联类型,const代表常量等值匹配:当你用col1=固定值 AND col2=固定值这类条件时,联合索引的每一列都对应一个确定的常量,优化器能直接定位到索引中唯一的条目,不需要扫描范围或全索引。- 这种场景下,MySQL会把常量值直接和索引列做匹配,是索引查询里效率最高的级别之一,因为不需要任何额外扫描,直接命中目标数据。
Using index vs Using index condition(ICP)的核心区别
| 特性 | Using index | Using index condition (ICP) |
|---|---|---|
| 适用场景 | 查询所需所有列都在索引中(覆盖索引),且索引列全为等值匹配 | WHERE子句包含索引列(含范围条件)+ 非索引列,需要存储引擎先过滤索引数据 |
| 数据读取逻辑 | 直接从索引中获取所有需要的数据,无需回表到主键索引 | 存储引擎先利用索引过滤部分数据,再将结果返回Server层过滤非索引列条件,可能需要回表 |
| 触发条件 | 覆盖索引 + 索引列全等值匹配 | 索引列存在范围/部分匹配,且有非索引列过滤条件 |
直白解释:
Using index:相当于“索引里已经有我要的所有东西,直接拿了就走,不用再去主表找”。Using index condition:相当于“先让存储引擎用索引筛掉大部分不符合的数据,剩下的再交给Server层核对非索引条件,省得把全表数据都拉上来检查”。
验证方法
1. 验证ref=const,const的触发条件
- 执行等值匹配查询:
此时EXPLAIN SELECT col1, col2 FROM your_table WHERE col1=100 AND col2='abc';ref列会显示const,const,因为两个索引列都是常量等值匹配。 - 修改为范围查询:
此时EXPLAIN SELECT col1, col2 FROM your_table WHERE col1>100 AND col2='abc';ref列会变成NULL(或显示range),因为col1是范围匹配,无法用常量直接定位唯一索引条目。
2. 验证Using index与ICP的区别
触发
Using index:确保查询的所有列都在联合索引中,且索引列全等值匹配:-- 假设联合索引是(col1, col2),查询列只有col1和col2 EXPLAIN SELECT col1, col2 FROM your_table WHERE col1=100 AND col2='abc';Extra列会显示
Using index,因为不需要回表,所有数据都在索引里。触发
Using index condition:给索引列加范围条件,同时加入非索引列的过滤条件:-- 联合索引是(col1, col2),查询包含非索引列non_col,且col1用范围条件 EXPLAIN SELECT * FROM your_table WHERE col1>100 AND col2='abc' AND non_col='test';Extra列会显示
Using index condition,因为存储引擎会先通过col1>100 AND col2='abc'过滤索引条目,再把数据传给Server层检查non_col='test'。
3. 验证ICP不触发的场景
当索引列全为等值匹配时,即使有非索引列条件,也不会触发ICP:
EXPLAIN SELECT non_col FROM your_table WHERE col1=100 AND col2='abc';
此时Extra列不会显示Using index condition,因为优化器直接通过联合索引定位到唯一行,直接回表取non_col即可,不需要中间过滤步骤。
内容的提问来源于stack exchange,提问作者Willow
相关产品推荐
相关产品推荐

