Index
幫助理解mongodb解釋結果
我在欄位 f1 上有一個索引。
{f1:1}
對以下查詢執行解釋
db.coll.find()
表示獲勝計劃是 CollScan(預期)
然而,對於
db.coll.find().sort({f1:1})
解釋說
"stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN",
我很難理解這一點,因為即使索引用於排序,它不應該進行集合掃描以獲取需要排序的文件嗎?
謝謝
我很難理解這一點,因為即使索引用於排序,它不應該進行集合掃描以獲取需要排序的文件嗎?
如果您完全迭代兩個查詢,它們最終會從集合中獲取所有文件,但它們在查詢計劃和執行方面採用不同的方法。
集合掃描意味著未使用索引並且以自然順序檢索文件(這是未定義的“磁碟上文件的順序”)。索引掃描表示使用了索引,無論該階段是否返回集合中的部分或全部文件。
如果您查看集合掃描的完整查詢解釋輸出,您應該看到
totalKeysExamined
0 並且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
索引以獲取匹配的文件。你應該看到IXSCAN
as 的inputStage
aFETCH
:"winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "f1" : 1 }, ... }
如果獲勝計劃不支持請求的排序順序,您仍然會看到一個
IXSCAN
或COLLSCAN
,但它將是記憶體SORT
階段的一部分(限制為 ~32MB 的文件):"winningPlan" : { "stage" : "SORT", "sortPattern" : { "f1" : 1 }, "inputStage" : { "stage" : "SORT_KEY_GENERATOR", "inputStage" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", ... }, ... } } }