Mysql 组合索引在范围查询中无效

Mysql 组合索引在范围查询中无效,mysql,indexing,Mysql,Indexing,我有一个问题: Select * from table where a>10 and b=10 综合指数是(a,b)。我的问题是为什么它只能在a>10中使用此复合索引,而b=10在解释计划中不使用复合索引。我认为,即使当a>10,b也在b+树中排序,那么为什么不在字段b中使用indexg呢?您需要在范围部分(a)之前使用索引的ref部分(akab)。因此,综合指数应该是(b,a) 索引的两个部分都创建了B+树。因此,搜索(a,b)索引需要搜索a>10中的所有b=10部分 如果它

我有一个问题:

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

综合指数是
(a,b)
。我的问题是为什么它只能在
a>10
中使用此复合索引,而
b=10
在解释计划中不使用复合索引。我认为,即使当
a>10
b
也在b+树中排序,那么为什么不在字段
b
中使用indexg呢?您需要在范围部分(
a
)之前使用索引的ref部分(aka
b
)。因此,综合指数应该是
(b,a)

索引的两个部分都创建了B+树。因此,搜索
(a,b)
索引需要搜索
a>10
中的所有
b=10
部分


如果它是
(b,a)
,你可以找到
b=10
a>10
,然后沿着树走,直到不再有
b=10
,你需要在范围部分(
a
)之前使用索引的ref部分(aka
b
)。因此,综合指数应该是
(b,a)

索引的两个部分都创建了B+树。因此,搜索
(a,b)
索引需要搜索
a>10
中的所有
b=10
部分

如果它是
(b,a)
,你可以找到
b=10
a>10
,然后沿着树走,直到不再有
b=10

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

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

它使用不同的索引吗?只有一个复合索引(a,b),我想知道为什么b不能使用这个索引只有一个复合索引,我想知道为什么(a,b)不能用在B+树上是不是用了不同的指数?只有一个综合指数(a,B),我想知道为什么B不能用这个指数只有一个综合指数,我想知道为什么(a,B)不能用在B+树上。我想这两种指数的成本是一样的,你能解释得更清楚一点吗?在树的本质上有一些很好的幻灯片。我认为这两种指数的成本是一样的,你能解释得更清楚些吗?在树的本质上有一些很好的幻灯片。及