如果有多个包含相同字段的索引,将使用哪个索引?

u3l*_*u3l 2 mongodb mongodb-query mongodb-indexes

例如,以find()一个顺序涉及一个字段a和的a为例b。例如,

db.collection.find({'a':{'$lt':10},'b':{'$lt':5}})
Run Code Online (Sandbox Code Playgroud)

我的集合索引数组中有两个键:

[
{
    "v" : 1,
    "key" : {
        "a" : 1,
        "b" : 1
    },
    "ns" : "x.test",
    "name" : "a_1_b_1"
},
{
    "v" : 1,
    "key" : {
        "a" : 1,
        "b" : 1,
        "c" : 1
    },
    "ns" : "x.test",
    "name" : "a_1_b_1_c_1"
}
]
Run Code Online (Sandbox Code Playgroud)

是否可以确保 mongo使用第一个键,因为它可以更准确地匹配查询,还是可以随机选择这两个键中的任何一个,因为它们都可以使用?

Chr*_*n P 5

MongoDB有一个查询优化器,用于选择最有效的索引。从文档

MongoDB查询优化器处理查询,并在给定可用索引的情况下为查询选择最有效的查询计划。

因此,不能严格保证(但是我希望较小的索引比较大的复合索引产生结果的速度更快)。您还可以使用提示运算符来强制查询优化器使用指定的索引。

db.collection.find({'a':{'$lt':10},'b':{'$lt':5}}).hint({a:1, b:1});
Run Code Online (Sandbox Code Playgroud)

但是,您的示例中的这两个索引是多余的。这是因为复合索引支持对索引字段的任何前缀进行查询。

以下索引:

db.collection.ensureIndex({a: 1, b: 1, c: 1});
Run Code Online (Sandbox Code Playgroud)

可支持的查询,其中包括aababc,但不是唯一的b或者c,或者只bc

  • 是的,我意识到了冗余...我只是好奇如果两个都存在,将会选择什么(您回答了)。 (2认同)