1)getting started
explain函數(shù)可以實現(xiàn)查看一些查詢的過程參數(shù)。用法如:
db.yourdb.find().explain()
可以得到一些必要的參數(shù),比如cursor,顯示了所使用的游標類型,比如basicCursor和BtreeCursor,后者意味著當前查詢使用了索引,因為索引是一類B樹,另外還有nscanned字段則顯示了掃描的文檔的個數(shù)。字段n則指明了返回字段的個數(shù)。另外還有millis顯示了做一次查詢所使用的時間,單位是ms。
2)then
我們有些時候會很需要millis字段,因為我們可以通過millis字段了解到當前查詢所使用的時間,同時可以通過觀察cursor的類型和nscanned&&n三個字段了解到當前通過索引查詢的效率。這些都是我們經(jīng)常關(guān)注的東西
3)but
遺憾的事情是,我們并不能一直保證這類的explain的查詢會對每一個結(jié)果有效,更多的僅限于find方法當中,因此我們有時需要找到一些可替代的方案
① distinct
?我們有時候需要在distinct上使用explain函數(shù)來查看執(zhí)行情況,但是很遺憾的是,explain并沒有針對distinct的方法,因此我們可以嘗試使用runCommand函數(shù)來執(zhí)行distinct,如:
執(zhí)行db.developers.distinct("company_category"),我們會得到:
[ 0, 1, 4, 9, 3, 2, 7, 5, 6 ]
但是執(zhí)行db.runCommand({distinct:'developers', key:'company_category'})
我們卻會得到:
{
"values" : [
0,
1,
4,
9,
3,
2,
7,
5,
6
],
"stats" : {
"n" : 135,
"nscanned" : 135,
"nscannedObjects" : 135,
"timems" : 0,
"cursor" : "BasicCursor"
},
"ok" : 1
}
② new Date
在很多時候我們需要查看一個命令運行的大概時間,那么我們可以嘗試一些比較原始的方案:
d = new Date;db.mydatabase.aggregate([{$group:{_id:"$jid"}}]);print(new Date -d + 'ms')
即在開始記錄一個時間,結(jié)束以后記錄一個時間,不過這類的時間精度保持在大約ms上。
③ aggregate
有很多mongo的用戶會發(fā)現(xiàn)aggregate同樣也不支持explain,當鍵入類似db.mydb.aggregate().explain()會發(fā)現(xiàn)shell會提示一句:
Wed Mar? 4 00:04:41.766 TypeError: Object [object Object] has no method 'explain'
很令人沮喪,但是這個問題在mongo 2.6以上的版本得到了解決,有感興趣的用戶可以更新mongodb到更新的版本當中來體驗一把~