联合索引是按顺序排好序的
我用最简单、最形象、最不绕弯的方式给你讲懂你现在卡住的点90%的人都在这里懵我一句话先点破超级核心结论你必须先记住**联合索引是按顺序排好序的只有前面字段完全确定后面字段才是有序的一旦前面出现范围 后面字段立刻乱序 → 索引失效我给你用【字典法】讲你瞬间就懂联合索引(a,b,c)排序规则先按 a 排序 → 再按 b 排序 → 再按 c 排序只有前面是“”后面才是排好序的情况1你能懂的a1 and b2 and c3索引结构是这样排好序的a1固定 b2固定 c3 ✔ c4 ✔ c5 ✔因为a 固定、b 固定所以c 是排好序的所以c3 可以用索引情况2你现在不懂的重点来了a1 and b2 and c in (1,2)索引结构是这样的a1固定 b3 → c 排序是1,2,4,5 b4 → c 排序是2,1,5,3 b5 → c 排序是5,2,1,4重点来了b 是范围2→ b 有很多值3、4、5…每个 b 对应的 c 都是分开排序、整体乱掉的**所以c 无法再用索引我用一句人话总结前面是 → 后面有序 → 索引能用前面是 → 后面乱序 → 索引失效回到你的问题1. 为什么a1 and b2 and c in(1,2)b 能命中c 不能命中因为a1 固定b2 是范围但 b 自己还是有序的 → 能用到索引但b 范围导致 c 乱序 → c 不能用索引2. 为什么a1 and b2 and c3c 能命中因为a 固定b 固定c 自然有序 → 可以用索引最终最精炼口诀背这个就够了前面等值后面有序前面范围后面乱序范围一断后面全断面试标准答案你直接背联合索引a,b,c是有序结构只有前面字段是等值时后面字段才是有序的。a1 and b2 and c3a、b 都是等值c 有序所以 c 能命中索引。a1 and b2 and c in(1,2)b 是范围查询导致 c 变成无序索引失效c 无法命中。范围列会中断后面所有索引字段无论后面是 in 还是 都无效。结合联合索引有序存储的本质用分组图示分步拆解彻底讲透两种场景看完就通。联合索引(a,b,c)底层存储逻辑先按a排序a相同再按b排序b相同再按c排序整条索引树是全局有序的。场景1a1 and b2 and c3条件a1(等值)、b2(等值)、c3(范围)索引数据分组a1 └── b2 ├── c1 ├── c2 ├── c3 ├── c4 ├── c5 └── c6a1精准定位到a1这一大组 ✅ 命中索引b2在a1组内精准定位到b2小组 ✅ 命中索引此时整个小组内的 c 是连续有序排列数据库可以直接在索引上筛选c3→c 也能命中索引✅ 最终a、b、c 三个字段全部走索引场景2a1 and b2 and c in (1,2)条件a1(等值)、b2(范围)、c in(1,2)(等值)索引数据分组a1 ├── b3 ← 满足 b2 │ ├── c5 │ ├── c1 │ ├── c4 │ └── c2 ├── b4 ← 满足 b2 │ ├── c2 │ ├── c3 │ └── c1 └── b5 ← 满足 b2 ├── c4 ├── c1 └── c3a1精准定位到a1大组 ✅ 命中索引b2在a1组内筛选出b3、4、5等数据b 自身是有序的所以b可以正常走索引 ✅ 命中索引关键问题b是范围匹配会命中多个不同的b值。每一个b内部的c虽然局部有序但跨b之后c整体完全乱序。数据库无法利用索引规则快速筛选c in (1,2)只能遍历数据过滤。→c 无法命中索引✅ 最终仅 a、b 两个字段走索引c 索引失效核心规则总结记这2句范围字段本身可以使用索引但范围字段之后的所有字段索引全部中断中断和后面是、in、无关只要前面出现范围后面字段都无法走索引检索仅能靠索引下推做数据过滤。对比复盘对应你两个疑问查询语句索引命中字段原因a1 and b2 and c3a、b、ca、b 都是等值c 保持全局有序范围查询可走索引a1 and b2 and c in(1,2)a、bb 是范围导致后续 c 整体乱序索引中断面试标准口述版联合索引遵循顺序排序规则字段依次有序排列。a1 and b2 and c3a 和 b 都是等值匹配锁定唯一分组组内 c 有序因此三个字段都能命中索引a1 and b2 and c in(1,2)b 属于范围查询b 本身有序可以命中索引但范围会匹配多组数据使得后面的 c 失去全局有序性索引中断c 无法使用索引检索。简单说范围字段本身可用索引范围之后索引全部失效。