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 })
请帮助理解,它是怎么回事。聚合查询必须由索引覆盖。为什么这么多的页面错误?
答案 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/