我的收藏需要复合索引,但我不确定按键顺序
我的项目:
{
_id,
location: {
type: "Point",
coordinates: [<lng>, <lat>]
},
isActive: true,
till: ISODate("2016-12-29T22:00:00.000Z"),
createdAt : ISODate("2016-10-31T12:02:51.072Z"),
...
}
我的主要问题是:
db.collection.find({
$and: [
{
isActive: true
}, {
'till': {
$gte: new Date()
}
},
{
'location': { $geoWithin: { $box: [ [ SWLng,SWLat], [ NELng, NELat] ] } }
}
]
}).sort({'createdAt': -1 })
在人类中,我需要地图中可见部分的所有活动项目,这些项目尚未过期,新添加 - 首先。
创建此索引是否正常:
db.collection.createIndex( { "isActive": 1, "till": -1, "location": "2dsphere", "createdAt": -1 } )
对于磁盘使用情况,性能的最佳顺序是什么?或许我必须创建几个索引......
谢谢!
答案 0 :(得分:3)
索引中字段的顺序应为:
在你的情况下,它将是:
db.collection.createIndex( { "isActive": 1, "createdAt": -1, "till": -1, "location": "2dsphere" } )
但是,布尔字段的索引通常不是很有用,因为平均而言MongoDB仍然需要访问一半的文档。所以我建议你做以下事情:
{"isActive": 1, "createdAt": -1, "till": -1, "location": "2dsphere" }
)在mongo shell中创建变量:
var exp = db.testCollection.explain(&#39; executionStats&#39;)
执行以下查询exp.find({'you query'})
它将返回描述获胜计划执行情况的统计信息
{"createdAt": -1, "till": -1, "location": "2dsphere"}
),执行exp.find({'you query'})
将结果与前一个比较答案 1 :(得分:2)
在Mongo中,很多东西都依赖于数据及其访问模式。在您的收藏集上创建索引时,很少有事情需要考虑 -
对于您的应用程序性能而言,指数可能会变得更好也更糟。在生产中使用它们之前,最好通过shell / compass进行测试。
var ex = db.<collection>.explain("executionStats")
在mongo shell中输入以上行时,会在可解释对象上显示光标,可以进一步用于检查性能问题。
ex.find(<Your query>).sort(<sort predicate>)
以上输出中的注意事项是
我们努力争取前三项(executionTimeMillis,totalKeysExamined和totalDocsExamined)的最小值,而“阶段”是告诉正在发生的事情的一个重要事项。如果Stage是“COLLSCAN”,那么它意味着它正在寻找满足查询的每个文档,如果Stage是“SORT”则表示它正在进行内存中排序。两者都不好。
来到您的查询,有几件事需要考虑 -
因此,请尝试使用实际数据并执行以下索引,并确定哪个索引应该适合考虑时间,否。的文档。检查等。
1. {"location": "2dsphere" , "createdAt": -1}
2. {"till":1, "location": "2dsphere" , "createdAt": -1}
在集合上应用两个索引并执行ex.find()。sort()其中ex是可解释的游标。然后你需要分析两个输出并进行比较以确定最佳结果。