我有个问题:
Select * from table where a>10 and b=10
综合指数为 (a,b) . 我的问题是为什么它只能在 a>10 ,和 b=10 在解释计划中没有使用综合指数。我想即使 a>10 , b 也在b+树中排序,所以为什么不在字段中使用indexg呢 b
(a,b)
a>10
b=10
b
xcitsw881#
您需要使用索引的ref部分(aka b )在范围部分之前( a ). 所以综合指数应该是 (b,a) .索引的两个部分都创建了b+树。所以寻找一个 (a,b) 索引将涉及搜索所有 a>10 对于 b=10 部分。如果是 (b,a) ,您可以找到 b=10 , a>10 然后沿着树走,直到没有更多 b=10 .
a
(b,a)
yyyllmsg2#
与 (a, b) 索引时,b树看起来像:
(a, 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树看起来像:
a > 10 AND b = 10
a > 10
b = 10
(b, a)
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树中分散开来。使用反向索引,它们在树中是连续的,这就是数据库需要的,以便能够有效地使用索引。
**
2条答案
按热度按时间xcitsw881#
您需要使用索引的ref部分(aka
b
)在范围部分之前(a
). 所以综合指数应该是(b,a)
.索引的两个部分都创建了b+树。所以寻找一个
(a,b)
索引将涉及搜索所有a>10
对于b=10
部分。如果是
(b,a)
,您可以找到b=10
,a>10
然后沿着树走,直到没有更多b=10
.yyyllmsg2#
与
(a, b)
索引时,b树看起来像:找到所有的行
a > 10 AND b = 10
它必须首先划分a > 10
树的级别,然后遍历每个子树以获取其b = 10
元素。带索引
(b, a)
b树看起来像:现在它可以简单地找到
b = 10
在树的第一级,并对其子树进行分区以获得a > 10
. 这不需要扫描多个子树。我已将选定的行标记为
**
在两张图中。使用索引,行在整个b树中分散开来。使用反向索引,它们在树中是连续的,这就是数据库需要的,以便能够有效地使用索引。