为什么我的mongodb查询速度如此之慢(在Swisscom云上)?
我正在通过Swisscom CloudFoundry使用一个(256MB)的MongoDB 3.2.9服务实例。只要我们的整个数据库适合可用的RAM,我们就会看到某种程度上可以接受的查询性能 然而,当我们的数据库不适合RAM时,我们正在经历非常长的聚合操作查询时间。我们已经为访问的字段创建了索引,但据我所知,这没有帮助 文档输入示例:为什么我的mongodb查询速度如此之慢(在Swisscom云上)?,mongodb,aggregation-framework,swisscomdev,Mongodb,Aggregation Framework,Swisscomdev,我正在通过Swisscom CloudFoundry使用一个(256MB)的MongoDB 3.2.9服务实例。只要我们的整个数据库适合可用的RAM,我们就会看到某种程度上可以接受的查询性能 然而,当我们的数据库不适合RAM时,我们正在经历非常长的聚合操作查询时间。我们已经为访问的字段创建了索引,但据我所知,这没有帮助 文档输入示例: _id: 5a31... description: Object location: "XYZ" name: "ABC" status:
_id: 5a31...
description: Object
location: "XYZ"
name: "ABC"
status: "A"
m_nr: null
k_nr: null
city: "QWE"
high_value: 17
right_value: 71
more_data: Object
number: 101
interval: 1
next_date: "2016-01-16T00:00:00Z"
last_date: null
status: null
classification: Object
priority_value: "?"
redundancy_value: "?"
active_value: "0"
查询示例:
db.getCollection('a').aggregate(
[{ $sort:
{"description.location": 1}
},
{ $group:
{_id: "$description.location"}
}],
{ explain: true }
)
此查询在只有20k条目的数据库上花费25sec,并生成1k输出字段
此查询的解释信息:
db.getCollection('a').aggregate([{ $group: {_id: "$description.location"} }], { explain: true }):
{
"waitedMS" : NumberLong(0),
"stages" : [
{
"$cursor" : {
"query" : {},
"fields" : {
"description.location" : 1,
"_id" : 0
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "Z.a",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : []
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : []
},
"direction" : "forward"
},
"rejectedPlans" : []
}
}
},
{
"$group" : {
"_id" : "$description.location"
}
}
],
"ok" : 1.0
}
[更新]db.a.getIndexes()的输出
看起来它正在进行集合扫描,您是否尝试在
description.location
上添加索引
db.a.createIndex({"description.location" : 1});
是的,谢谢-在
description.location
上有一个索引-知道为什么它可能没有使用索引吗?只是在本地尝试了这个并使用了索引,你能运行db.a.getIndexes()
并用输出更新问题吗?是的,我会尽快用输出更新。我也在本地进行了测试,它确实使用了索引。因此,我开始怀疑Swisscom云中的MongoDB设置是否有什么特殊之处。我在另一个帖子上读到他们禁用了一些安全性。javaScriptEnabled
设置:@Chris这也是我的赌注,看起来他们可能正在禁用某些东西。是的,我在这里发帖是想从Swisscom工程师那里得到反馈,因为这显然是他们提供客户服务的首选方式。。。希望他们也能做出回应:D
db.a.createIndex({"description.location" : 1});