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

时间:2018-09-04 03:58:40

标签: mysql indexing

我有一个查询:

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

综合索引为(a,b)。我的问题是为什么它只能在a>10中使用此综合索引,而b=10在解释计划中不使用复合索引。我认为即使a>10b在B +树中也被排序,所以为什么不在字段b中使用indexg

2 个答案:

答案 0 :(得分:1)

您需要在范围部分(b)之前使用索引的引用部分(aka a)。因此,综合索引应为(b,a)

索引的两个部分均创建B +树。因此,搜索(a,b)索引将涉及搜索a>10的所有b=10部分。

如果它是(b,a),则可以找到b=10a>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树中。有了反向索引,它们在树中是连续的,这是数据库需要的,以便能够有效地使用索引。