为什么我的mongodb查询速度如此之慢(在Swisscom云上)?

为什么我的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:

我正在通过Swisscom CloudFoundry使用一个(256MB)的MongoDB 3.2.9服务实例。只要我们的整个数据库适合可用的RAM,我们就会看到某种程度上可以接受的查询性能

然而,当我们的数据库不适合RAM时,我们正在经历非常长的聚合操作查询时间。我们已经为访问的字段创建了索引,但据我所知,这没有帮助

文档输入示例:

_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});