分析查询性能
explain()游标方法允许你检查查询系统的操作。此方法用于分析查询的效率是有用的,以及用于确定查询如何使用索引。 explain() 方法测试查询操作,而不是对查询性能的计时。因为explain()尝试多个查询计划,它不反映查询性能的精确计时。
一、评估一个查询的性能
使用explain()方法,在find()方法返回一个游标时调用这个方法。
例如:
评估inventory集合type字段的一个查询,在type字段上有一个索引。
db.inventory.find( { type: 'food' } ).explain()
考虑下面的结果:
{
"cursor" : "BtreeCursor type_1",
"isMultiKey" : false,
"n" : 5,
"nscannedObjects" : 5,
"nscanned" : 5,
"nscannedObjectsAllPlans" : 5,
"nscannedAllPlans" : 5,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : { "type" : [
[ "food",
"food" ]
] },
"server" : "mongodbo0.example.net:27017" }
cursor字段的BtreeCursor值表明该查询使用一个索引。
n字段表示该查询返回5个文档。
到返回的5个文档,查询扫描5个文档上的索引,用nscanned字段表示。然后从集合的5个完整的文档读取。用nscannedObjects字段表示。
如果没有索引,查询会扫描整个集合返回5个文档。
查看Explain Results方法对输出的全部细节。
二、比较索引性能
手动比较使用多个索引的查询的性能,您可以结合使用 hint()和explain()方法。
例如:
使用不同的索引评估一个查询:
db.inventory.find( { type: 'food' } ).hint( { type: 1 } ).explain()
db.inventory.find( { type: 'food' } ).hint( { type: 1, name: 1 } ).explain()
这返回关于使用相应索引的查询的执行的统计信息。
注:
如果你运行说explain(),而不包括hint(),查询优化器重新评估查询,返回查询统计信息前运行相对的多条索引。
有关解释输出更多的细节,请参阅Explain Results。