索引该怎么建?

有条SQL a=xx and b>xx and b<xxx,b字段的选择性高,a字段选择性不高,那么建索引该怎么建立
我感觉(a,b)这样比较合适点

将等值查询的 a放在最左,可以快速定位到a=xx的所有数据行,(a,b)是最优了

是的,感觉还是(a,b)是最优的

a,b , 然后筛选的字段排序的字段都加上

我觉得(b,a)索引就比较好

那就直接(a,b)就行了

为什么 (a,b) 是合理索引

数据库索引遵循一个经典规则:

等值列在前
范围列在后

所以:

(a,b)

索引结构(B+Tree)会变成:

a → b → rowid

执行流程:

1 定位 a = ?
2 在该 a 的范围内
3 按 b 做范围扫描

扫描范围:

a = const
AND b between x and y

这样扫描的数据量会明显减少。

1 个赞

一般推荐:

INDEX(a, b)

原因:

联合索引遵循最左前缀原则

执行顺序是:

a = xx → 精确定位
b range → 在 a 的范围内扫描

1 个赞

是的,数据库都是优先按等值条件来定位的