標籤:mongodb 查詢 效能 分析
分析查詢效能explain() cursor方法允許觀察查詢系統執行的操作。這個方法對於分析高效查詢和決定如何使用索引進行查詢是十分有用的。這個方法檢測的是查詢的操作,而不是查詢執行時間。因為這個方法嘗試多個查詢計劃,它並不能準確的反映出查詢執行時間。
評估一個查詢的效能使用explain()方法,調用find()返回的指標的該方法即可。
例:
在type欄位建立索引
db.testData.ensureIndex({‘type‘:1});
評估一個在type欄位上的查詢。
db.testData.find({type:‘food‘}).explain()
結果如下:
{
"cursor" : "BtreeCursor type_1",
"isMultiKey" : false,
"n" : 3,
"nscannedObjects" : 3,
"nscanned" : 3,
"nscannedObjectsAllPlans" : 3,
"nscannedAllPlans" : 3,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 1,
"nChunkSkips" : 0,
"millis" : 64,
"indexBounds" : {
"type" : [
[
"food",
"food"
]
]
},
"server" : "TT:27017",
"filterSet" : false
}
cursor值為BtreeCursor表名查詢使用了索引。
查詢返回n=3條記錄。
為了返回這五條記錄,查詢掃描了nscanned=3條記錄,然後讀到了nscannedObjects=3條完整的記錄,如果沒有索引,將掃描所有記錄。
比較索引查詢效能手動比較一個使用多個欄位的查詢,可以聯合使用hint()和explain()方法。
例:評估使用不同欄位的索引
db.testData.find({type:‘food‘}).hint({type:1}).explain();
結果:
{
"cursor" : "BtreeCursor type_1",
"isMultiKey" : false,
"n" : 3,
"nscannedObjects" : 3,
"nscanned" : 3,
"nscannedObjectsAllPlans" : 3,
"nscannedAllPlans" : 3,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 40,
"indexBounds" : {
"type" : [
[
"food",
"food"
]
]
},
"server" : "TT:27017",
"filterSet" : false
}
db.testData.find( { type: ‘food‘ } ).hint( { type: 1, name: 1 } ).explain();
//這句話執行不成功,待解決
這些返回的統計結果忽略了使用各自的索引的執行的查詢。
注意:如果不適用hint()執行explain()方法,查詢最佳化工具將重新評估查詢,並且在返回查詢統計之前運行多索引查詢。
更詳細的explain輸出,查看explain-results。
MongoDB 操作手冊CRUD 查詢效能分析