【发布时间】:2019-03-21 11:35:11
【问题描述】:
我有一个 Mongo 集合,其中包含数百万个具有以下格式的文档:
{
"_id" : ObjectId("5ac37fa989e00723fc4c7746"),
"group-number" : NumberLong(128125089),
"date" : ISODate("2018-04-03T13:20:41.193Z")
}
我想检索按“group-number”排序的 2 个日期(“date”)之间的文档。所以,我正在执行这种查询:
db.getCollection('group').find({date:{$gt:new Date(1491372960000),$lt:new Date(1553152560000)}}).sort({"group-number":1})
根据https://blog.mlab.com/2012/06/cardinal-ins/ 看来,MongoDB 在不按 equivalent 值但使用 range 值(如我的情况)查询时,最好有一个索引以相反的顺序(首先是排序的字段/然后是过滤的字段)。
事实上,我使用索引db.group.createIndex({"group-number":1,"date":1}); 获得了最好的结果。但是仍然需要很长时间;在相同情况下超过 40 秒。
根据explain()的结果,确实是在使用上面的索引。
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"date" : {
"$lt" : ISODate("2019-03-21T07:16:00.000Z")
}
},
{
"date" : {
"$gt" : ISODate("2017-04-05T06:16:00.000Z")
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"group-number" : 1.0,
"date" : 1.0
},
"indexName" : "group-number_1_date_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"group-number" : [],
"date" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"group-number" : [
"[MinKey, MaxKey]"
],
"date" : [
"[MinKey, MaxKey]"
]
}
}
}
如何提高性能?我一定是错过了什么……
【问题讨论】:
-
嘿!你弄明白了吗?
-
不,我终于放弃了。现在我提取按“日期”排序的数据,因此我还必须调整处理数据的过程。
-
您是否考虑过 ETL 到一些列式存储而不是查询 mongodb?