gpt4 book ai didi

mysql - 复合索引不适用于范围查询

转载 作者:行者123 更新时间:2023-11-29 06:39:54 28 4
gpt4 key购买 nike

我有一个疑问:

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

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

中使用indexg

最佳答案

使用 (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 树中。通过反向索引,它们在树中是连续的,这就是数据库为了能够有效地使用索引所需要的。

关于mysql - 复合索引不适用于范围查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52158603/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com