我有一个查询:
Select *
from table
where a>10 and b=10
综合索引为(a,b)
。我的问题是为什么它只能在a>10
中使用此综合索引,而b=10
在解释计划中不使用复合索引。我认为即使a>10
,b
在B +树中也被排序,所以为什么不在字段b
中使用indexg
答案 0 :(得分:1)
您需要在范围部分(b
)之前使用索引的引用部分(aka a
)。因此,综合索引应为(b,a)
。
索引的两个部分均创建B +树。因此,搜索(a,b)
索引将涉及搜索a>10
的所有b=10
部分。
如果它是(b,a)
,则可以找到b=10
,a>10
,然后漫步在树上直到没有b=10
为止。
答案 1 :(得分:1)
使用(a, b)
索引,B树看起来像:
a: 1 -
b: 1
2
4
5
10
15
5 -
b: 2
11
22
15 -
b: 3
10 **
20
20 -
b: 5
9
10 **
11
要找到所有必须a > 10 AND b = 10
对其进行分区的a > 10
级别的行,然后遍历这些子树中的每一个以获得其b = 10
元素。
带有索引(b, a)
的B树看起来像:
b: 1 -
a: 1
2 -
a: 1
5
4 -
a: 1
5 -
a: 1
20
9 -
a: 20
10 -
a: 1
15 **
20 **
11 -
b: 5
20
20 -
b: 15
22 -
b: 5
现在,它可以简单地在树的第一级中找到b = 10
,并对其子树进行分区以获得a > 10
。这不需要扫描多个子树。
在两个图中,我已经用**
标记了选定的行。通过索引,行分散在整个B树中。有了反向索引,它们在树中是连续的,这是数据库需要的,以便能够有效地使用索引。