首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合索引在范围查询中无效

复合索引在范围查询中无效
EN

Stack Overflow用户
提问于 2018-09-04 11:58:40
回答 2查看 140关注 0票数 0

我有一个问题:

代码语言:javascript
复制
Select * 
from table 
where  a>10 and b=10  

综合指数为(a,b)。我的问题是,为什么b=10只能在a>10中使用复合索引,而在explain plan中不使用复合索引。我认为即使在a>10时,b也是在B+树中排序的,所以为什么不在字段b中使用indexg呢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-04 14:52:39

使用(a, b)索引,B树如下所示:

代码语言:javascript
复制
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将如下所示:

代码语言:javascript
复制
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树中。使用反向索引,它们在树中是连续的,这是数据库为了能够有效地使用索引而需要的。

票数 1
EN

Stack Overflow用户

发布于 2018-09-04 12:54:54

您需要在范围部分(a)之前使用索引的ref部分(也称为b)。因此,综合指数应该是(b,a)

索引的两个部分都创建了B+树。因此,搜索(a,b)索引将涉及到在整个a>10中搜索b=10部件。

如果是(b,a),你可以找到b=10a>10,然后遍历树,直到没有b=10

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52158603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档