mongodb 3.2.7不使用复合索引的排序
我使用的是mongodb 3.2.7,文档如下:mongodb 3.2.7不使用复合索引的排序,mongodb,mongodb-query,Mongodb,Mongodb Query,我使用的是mongodb 3.2.7,文档如下: { "finished" : true, "buildNo": 1, "tryTimes" : 1, "createdTime" : ISODate("2019-05-16T19:00:50.604+08:00"), "modifiedTime" : ISODate("2019-12-27T18:33:25.682+08:00"), } 我使用以下方法创建索引: db.getCollection('bui
{
"finished" : true,
"buildNo": 1,
"tryTimes" : 1,
"createdTime" : ISODate("2019-05-16T19:00:50.604+08:00"),
"modifiedTime" : ISODate("2019-12-27T18:33:25.682+08:00"),
}
我使用以下方法创建索引:
db.getCollection('builds').createIndex({"createdTime": 1})
db.getCollection('builds').createIndex({"tryTimes": 1, "createdTime": -1})
我的问题是:
db.getCollection('builds').find({
"createdTime": {$lte: new Date("2020-04-15T00:00:00.000Z"), $gte: new Date("2020-04-01T00:00:00.000Z")},
"buildNo": 1,
"finished": {$ne: true}
})
.sort({"tryTimes": 1, "createdTime": -1})
.limit(200)
但是这个查询没有使用我以前创建的索引。explain()输出:
即使我试图将查询简化为
db.getCollection('builds')
.find({ "buildNo": 1, "finished": true })
.sort({"tryTimes": 1, "createdTime": -1})
.limit(200)
,索引仍然不起作用
最重要的是:我在另一个mongondb版本上使用相同的索引和查询。3.4.14.3. 索引工作
任何想法都受到欢迎和赞赏
非常感谢 如果一个查询可以由集合中定义的多个索引来满足(因为Mongo实际上选择了所有可能相关的索引,所以不能使用满足),那么MongoDB将并行测试所有适用的索引(这意味着Mongo执行“竞争”)。查询计划器将选择第一个可以返回101个结果的索引 这意味着对于特定的查询,使用“错误”索引的查询将获胜 你能做什么 您可以使用,提示基本上强制Mongo使用特定的索引,但不建议使用Mongo,因为如果发生更改,Mongo将无法适应这些更改 像这样:
db.getCollection('builds')
.find({ "buildNo": 1, "finished": true })
.sort({"tryTimes": 1, "createdTime": -1})
.limit(200)
.hint({tryTimes: 1, createdTime: -1})
非常感谢,汤姆。这真的很有帮助。我想我会让mongo决定使用哪个索引。另一个问题:我们如何判断是“错误的”索引赢了,还是我们创建的索引不合适。你不知道你创建的索引是否合适(有时很明显,但有时需要测试以找到最佳索引)。此外,对于查询代码,也没有实际的方法知道什么是“正确”或“错误”索引,这就是Mongo选择race方法的原因。我使用的经验法则是根据我的需要创建定制的索引(通常是多字段复合索引),如果我突然获得不好的意外性能,几乎总是由于Mongo使用了错误的索引。
db.getCollection('builds')
.find({ "buildNo": 1, "finished": true })
.sort({"tryTimes": 1, "createdTime": -1})
.limit(200)
.hint({tryTimes: 1, createdTime: -1})