MongoDB复合索引实际上如何工作?

问题描述 投票:-1回答:1

我在mongodb中创建复合索引,我发现了一个奇怪的行为。我创建了一个索引:

db.getCollection('Subject').createIndex({a:1, b:2, c:3})

它创建了一个名为a_1_b_2_c_3的索引。

现在,当我使用mongo find命令时:

db.getCollection('Subject').find({a:1, b:2, c:3}) //it works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({a:1, b:2}) //this also works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({a:1, c:2}) //this also works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({b:1, c:2}) //But this command doesn't uses the index `a_1_b_2_c_3`.

任何人都可以让我知道为什么会发生这种行为?

mongodb mongodb-indexes
1个回答
1
投票

这是由于index prefixes。索引{a:1, b:1, c:1}具有前缀{ a: 1 }{ a: 1, b: 1},因此包含这些字段上的过滤器的查询将使用索引。

从概念上讲,将索引想象为一个以a上的过滤器开头的B树,并且在较低级别的bc上有子树。较早的查询可以很容易地从树的顶部开始并向下工作,而最后一个查询({b:1, c:2})不会有一个简单的起点。

© www.soinside.com 2019 - 2024. All rights reserved.