我有一个问题:
Select *
from table
where a>10 and b=10 综合指数为(a,b)。我的问题是,为什么b=10只能在a>10中使用复合索引,而在explain plan中不使用复合索引。我认为即使在a>10时,b也是在B+树中排序的,所以为什么不在字段b中使用indexg呢
发布于 2018-09-04 14:52:39
使用(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元素。
WIth a index (b, a) the B-tree将如下所示:
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树中。使用反向索引,它们在树中是连续的,这是数据库为了能够有效地使用索引而需要的。
发布于 2018-09-04 12:54:54
您需要在范围部分(a)之前使用索引的ref部分(也称为b)。因此,综合指数应该是(b,a)。
索引的两个部分都创建了B+树。因此,搜索(a,b)索引将涉及到在整个a>10中搜索b=10部件。
如果是(b,a),你可以找到b=10,a>10,然后遍历树,直到没有b=10。
https://stackoverflow.com/questions/52158603
复制相似问题