当索引覆盖查询时,许多mongo页面错误

时间:2014-11-25 07:48:48

标签: performance mongodb mongodb-query

db.runCommand({ "aggregate": "collection_name", "pipeline": [ { "$match": { "CompanyId": { "$gte": 720, "$lte": 740 } } }, { "$project": { "CompanyId": 1, "_id": 0} }, { "$group": { "_id": "$CompanyId", "total": { "$sum": 1 } } } ]})

db.collection_name.find({"CompanyId": {"$gte": 720, "$lte": 740}}, {"CompanyId": 1, "_id": 0})

解释第二个查询

 {
   "cursor" : "BtreeCursor CompanyId_1",
   "isMultiKey" : false,
   "n" : 491699,
   "nscannedObjects" : 0,
   "nscanned" : 491699,
   "nscannedObjectsAllPlans" : 0,
   "nscannedAllPlans" : 491699,
   "scanAndOrder" : false,
   "indexOnly" : true,
   "nYields" : 3841,
   "nChunkSkips" : 0,
   "millis" : 424,
   "indexBounds" : {
    "CompanyId" : [
        [
            720,
            740
        ]
    ]
},
"filterSet" : false

}

查询由索引覆盖,但有许多nYield。 mongo索引的总大小为700Mb。服务器有6GB Ram。

Agreggation查询速度慢(5-25秒),mongostat显示许多页面错误(700页错误) 即使运行命令后,页面错误也一样。

db.runCommand({ touch: "collection_name", index: true })

请帮助理解,它是怎么回事。聚合查询必须由索引覆盖。为什么这么多的页面错误?

1 个答案:

答案 0 :(得分:0)

这一点并没有直接回答你关于收益率的问题,但它会回答速度问题。

即使您有一个覆盖的查询,也应该注意MongoDB由于回归而无法在聚合中使用覆盖的索引。

以下是2.6+(稳定)中适用于此限制的任务列表:https://jira.mongodb.org/browse/SERVER-12015?jql=project%20%3D%20SERVER%20AND%20component%20%3D%20%22Aggregation%20Framework%22%20AND%20text%20~%20%22covered%20index%22,其中第一个是主要问题。

至于yeilds:关于服务器上的工作负载以及其他方面缺乏信息。这并不意味着查询很慢;在424毫秒扫描的491,699个文件并不是太糟糕,这可能意味着您的服务器在运行此查询时遇到负载,也可能是索引的数据当时不在RAM中,因此需要进行分页, mongodb倾向于在分页数据时允许其他操作运行,700MB是很多页面。

有关收益率的更多信息,请访问:http://docs.mongodb.org/manual/faq/concurrency/