复合索引在范围查询中不起作用

cgvd09ve  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(378)

我有个问题:

Select * 
from table 
where  a>10 and b=10

综合指数为 (a,b) . 我的问题是为什么它只能在 a>10 ,和 b=10 在解释计划中没有使用综合指数。我想即使 a>10b 也在b+树中排序,所以为什么不在字段中使用indexg呢 b

xcitsw88

xcitsw881#

您需要使用索引的ref部分(aka b )在范围部分之前( a ). 所以综合指数应该是 (b,a) .
索引的两个部分都创建了b+树。所以寻找一个 (a,b) 索引将涉及搜索所有 a>10 对于 b=10 部分。
如果是 (b,a) ,您可以找到 b=10 , a>10 然后沿着树走,直到没有更多 b=10 .

yyyllmsg

yyyllmsg2#

(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树中分散开来。使用反向索引,它们在树中是连续的,这就是数据库需要的,以便能够有效地使用索引。

相关问题