580 字
3 分钟
联合索引范围条件之后的列还能使用吗
  1. 1MySQL 面试复习导读:知识地图与阅读路线
  2. 2MySQL 存储引擎怎么选:InnoDB、MyISAM 与 MEMORY
  3. 3MySQL 索引类型与 B+ 树:结构、分类和失效场景
  4. 4MySQL B+ 树查询全过程:从根节点到页目录
  5. 5InnoDB 聚簇索引与二级索引:什么是回表
  6. 6MySQL 覆盖索引:如何避免回表
  7. 7MySQL 联合索引的最左前缀匹配原则
  8. 8MySQL 索引下推:把过滤提前到存储引擎
  9. 9MySQL 事务异常读:脏读、不可重复读与幻读
  10. 10MySQL 四种事务隔离级别与选型取舍
  11. 11MySQL MVCC:Undo Log、版本链与 ReadView
  12. 12MySQL InnoDB 锁的分类:行锁、表锁与意向锁
  13. 13MySQL 乐观锁与悲观锁:冲突少时重试,冲突多时排队
  14. 14MySQL 发生死锁怎么办:检测、定位与处理
  15. 15MySQL 事务的 ACID 特性分别是什么
  16. 16InnoDB Redo Log 如何保证崩溃恢复
  17. 17InnoDB Undo Log 的回滚与 MVCC 作用
  18. 18MySQL Binlog 是什么,和 Redo Log 有什么区别
  19. 19一条 MySQL 查询从连接到返回结果经历什么
  20. 20如何用 EXPLAIN 读懂 MySQL 执行计划
  21. 21MySQL 为什么需要 Redo Log 与 Binlog 两阶段提交
  22. 22MySQL 崩溃后如何恢复已提交事务
  23. 23InnoDB Buffer Pool 如何提升查询与写入性能
  24. 24联合索引应该如何设计
  25. 25InnoDB 快照读与当前读如何处理幻读
  26. 26联合索引范围条件之后的列还能使用吗本文
  27. 27MySQL 索引看起来失效了,如何判断优化器的选择
  28. 28MySQL 8.0 如何定位并处理 InnoDB 死锁
  29. 29MySQL 慢查询如何定位和优化
  30. 30MySQL 的 ORDER BY、GROUP BY 与 filesort
  31. 31MySQL 普通索引和唯一索引如何选择
  32. 32MySQL 主从复制的基本流程是什么
  33. 33MySQL 主从延迟和读写分离如何处理
  34. 34MySQL 深分页为什么慢,如何改写
  35. 35InnoDB 主键应该如何设计
  36. 36MySQL 字符集与排序规则有什么区别
  37. 37数据库范式与反范式如何取舍

“联合索引遇到范围条件后,后续列就失效”把几种作用混在了一起。以 InnoDB 索引 (a,b,c) 和查询 WHERE a=1 AND b>=10 AND c=3 为例,a=1 与 b>=10 可构造索引连续扫描范围;范围列 b 之后的 c 通常不能继续把同一范围精确切成更小的 B+ 树区间,但 c 并非一定完全无用。

ICP 过滤: 若 c 位于二级索引中且条件满足下推条件,存储引擎可扫描索引条目时先检查 c=3,只对候选条目回表。EXPLAIN 的 Using index condition 可提示 ICP。它减少回表,不等于消除了索引扫描。

覆盖读取: 若查询只需 a,b,c 等索引中已有列,查询可能直接从索引返回,避免回表。此时即使 c 没用于缩小范围,也仍可能因覆盖而有价值。覆盖索引增加叶子宽度和写入成本,应控制列数。

排序: 索引列有序不代表任意 ORDER BY 都能避免排序。对 (a,b,c),固定 a 后,按 b,c 的顺序读取有机会利用索引顺序;但 WHERE a=1 AND b>=10 ORDER BY c 中结果按 b 再按 c 排列,并非全局按 c,通常仍要额外排序。是否 filesort 以计划为准。

EXPLAIN SELECT c FROM t WHERE a=1 AND b>=10 AND c=3;
EXPLAIN SELECT a,b,c FROM t WHERE a=1 AND b>=10 AND c=3;
EXPLAIN SELECT * FROM t WHERE a=1 AND b>=10 ORDER BY c;

第一条关注范围与 ICP;第二条可观察覆盖可能性;第三条观察排序。MySQL 8.0 中计划仍由成本模型、统计信息和数据分布决定。EXPLAIN ANALYZE 会实际执行查询,使用前应确认语句和负载安全。

追问#

范围列后的条件一定不能用索引吗?#

不一定。它通常不能进一步构造连续范围,但可由 ICP 检查,也可能用于覆盖读取;看 Extra、key 和实际行数。

ICP 是不是覆盖索引?#

不是。ICP 可先过滤再决定是否回表;覆盖索引表示所需列都能由索引提供,通常无需回表。

(a,b,c) 能支持 WHERE a=1 AND b>2 ORDER BY c 吗?#

它能用于 a、b 的范围查找,但结果按 b、c 排序,通常不能保证全局 c 顺序;用 EXPLAIN 检查是否额外排序。

联合索引范围条件之后的列还能使用吗
https://blog.xqcherry.top/posts/interview/mysql/index-range-columns-icp/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0