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使用第一个键,因为它可以更准确地匹配查询,还是可以随机选择这两个键中的任何一个,因为它们都可以使用?
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)
可支持的查询,其中包括a,a和b和a和b和c,但不是唯一的b或者c,或者只b和c。