2014-11-25 88 views
0
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 

}

查詢被指數所覆蓋的,但有許多nYields。 Mongo索引的總大小是700Mb。服務器有6GB RAM。

Agreggation查詢很慢(5-25秒),mongostat顯示很多頁面錯誤(700頁錯誤) 即使在運行命令後,頁面錯誤也一樣。

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

請幫忙理解,它是怎麼回事。聚合查詢必須由索引覆蓋。爲什麼有這麼多頁面錯誤?

+0

上CompanyId定義指標不包括 – Disposer 2014-11-25 08:28:45

+4

聚集查詢,它將從磁盤加載的文件。目前彙總不能使用覆蓋索引 – Sammaye 2014-11-25 09:33:09

+0

@Sammaye:雖然這個評論很簡短,但我認爲它值得升級到答案,也許有一個鏈接到文檔。 – 2014-11-25 12:30:28

回答

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/