Index

幫助理解mongodb解釋結果

  • March 31, 2019

我在欄位 f1 上有一個索引。{f1:1}

對以下查詢執行解釋

db.coll.find()

表示獲勝計劃是 CollScan(預期)

然而,對於db.coll.find().sort({f1:1})

解釋說

"stage" : "FETCH",
           "inputStage" : {
               "stage" : "IXSCAN",

我很難理解這一點,因為即使索引用於排序,它不應該進行集合掃描以獲取需要排序的文件嗎?

謝謝

我很難理解這一點,因為即使索引用於排序,它不應該進行集合掃描以獲取需要排序的文件嗎?

如果您完全迭代兩個查詢,它們最終會從集合中獲取所有文件,但它們在查詢計劃和執行方面採用不同的方法。

集合掃描意味著未使用索引並且以自然順序檢索文件(這是未定義的“磁碟上文件的順序”)。索引掃描表示使用了索引,無論該階段是否返回集合中的部分或全部文件。

如果您查看集合掃描的完整查詢解釋輸出,您應該看到totalKeysExamined0 並且totalDocsExamined等於返回的文件數。

db.coll.find().explain(’executionStats')

您的 winningPlan第一個查詢應該是一個簡單的COLLSCAN階段:

   "winningPlan" : {
       "stage" : "COLLSCAN",
       "direction" : "forward"
   }

db.coll.find().sort({f1:1}).explain(’executionStats')

在您的第二個查詢範例中,索引支持請求的排序順序,因此您應該看到totalKeysExamined並且totalDocsExamined等於返回的文件數(假設這f1不是多鍵(數組)索引)。

winningPlan應該是一個索引掃描(IXSCAN),它按排序順序迭代f1索引以獲取匹配的文件。你應該看到IXSCANas 的inputStagea FETCH

   "winningPlan" : {
       "stage" : "FETCH",
       "inputStage" : {
           "stage" : "IXSCAN",
           "keyPattern" : {
               "f1" : 1
           },
           ...
   }

如果獲勝計劃支持請求的排序順序,您仍然會看到一個IXSCANCOLLSCAN,但它將是記憶體SORT階段的一部分(限制為 ~32MB 的文件):

   "winningPlan" : {
       "stage" : "SORT",
       "sortPattern" : {
           "f1" : 1
       },
       "inputStage" : {
           "stage" : "SORT_KEY_GENERATOR",
           "inputStage" : {
               "stage" : "FETCH",
               "inputStage" : {
                   "stage" : "IXSCAN",
                   ... 
               },
               ...
           }
       }
   }

引用自:https://dba.stackexchange.com/questions/233593