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部分(akab
)。因此,综合指数应该是(b,a)
索引的两个部分都创建了B+树。因此,搜索(a,b)
索引需要搜索a>10
中的所有b=10
部分
如果它是
(b,a)
,你可以找到b=10
,a>10
,然后沿着树走,直到不再有b=10
,你需要在范围部分(a
)之前使用索引的ref部分(akab
)。因此,综合指数应该是(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+树上。我想这两种指数的成本是一样的,你能解释得更清楚一点吗?在树的本质上有一些很好的幻灯片。我认为这两种指数的成本是一样的,你能解释得更清楚些吗?在树的本质上有一些很好的幻灯片。及