MySQL

联合索引里,范围条件为什么要放最后

联合索引 (name, age) 的叶子先按 name 排,name 相同的再按 age 排。所以 age 只在 name 完全相同的那一小组里有序。

sql
-- 两列都能定扫描起止:name 固定后,age 是连续的一段
WHERE name = '张三' AND age > 10

-- 只有 name 能定起止:'张%' 本身是范围,这段里 name 各不相同,age 来回跳
WHERE name LIKE '张%' AND age > 10

-- 一列都用不上:age 在整条叶子链上不连续
WHERE age = 10

规律就一句:某一列用了范围,它后面的列只能逐条过滤,没法再缩小扫描范围。所以设计联合索引时,等值列放前面,范围列放最后。

B+ 树本身可以这样想:上面几层是目录,负责从根跳到起点;最底层的叶子页串成双向链表,从起点顺着往后读。下楼用树,翻范围用链。

esc