對于衡量數(shù)據(jù)庫及索引設計的效率來說,分析查詢是一個很重要的衡量方式。經常使用的查詢有 $explain 和 $hint。
$explain 操作提供的消息包括:查詢消息、查詢所使用的索引以及其他的統(tǒng)計信息。在分析索引優(yōu)化方案時,這是一個非常有用的工具。
在上一節(jié)中,我們使用如下查詢,針對 users 集合的字段 gender 和 user_name 創(chuàng)建了索引:
>db.users.ensureIndex({gender:1,user_name:1})
接下來,在下列查詢中使用 $explain。
>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
上述 explain()
查詢返回下列分析結果:
{
"cursor" : "BtreeCursor gender_1_user_name_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 0,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : true,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"gender" : [
[
"M",
"M"
]
],
"user_name" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
我們將在結果集中看到這些字段:
$hint 操作符強制索引優(yōu)化器使用指定的索引運行查詢。這尤其適用于測試帶有多個索引的查詢性能。比如,下列查詢指定了用于該查詢的 gender 和 user_name 字段的索引:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
使用 $hint 來優(yōu)化上述查詢:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()