我正在使用mongodb作为我们的应用程序。 我通过将system.profiling级别设置为2来使用mongodb profiler,完成所有应用程序操作,从system.profile导出所有记录,最后根据分析器结果设置集合上的索引。
现在我确实解释了这些问题
查询1。
db.stocks.find({ symbol: "GOOG", date: "2013-09-13",type: "O",Mini: false, rootsymbol: "GOOG" }).sort( { "price": 1,"call":1} ).explain();
{
"cursor" : "BtreeCursor symbol_1_date_1_type_1_Mini_1_rootsymbol_1_price_1",
"nscanned" : 80,
"nscannedObjects" : 80,
"n" : 80,
"scanAndOrder" : true,
"millis" : 2,
查询2.
db.stocks.find({ symbol: "NVO" }).explain()
{
"cursor" : "BtreeCursor symbol_1",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 0,
"indexBounds" : {
"symbol" : [
[
"NVO",
"NVO"
]
]
}
}
我对结果感到困惑,因为nscanned
,nscannedObjects
和n
在我的所有查询中始终相等。
如果nscanned,nscannedObjects和n值具有相等的值,请告诉我是否存在问题?
如果我遗失了某些内容或是否有问题,请告诉我?
答案 0 :(得分:1)
他们都是平等的这一事实意味着你有良好的,未被发现的索引用法。
我将分解结果:
"nscanned" : 80,
这是在索引中扫描的数字
"nscannedObjects" : 80,
这是扫描索引后加载的文档数,如果此数字高于扫描数,则可能导致索引使用不良(取决于方案)。
时间nscannedObjects
可能低于nscanned覆盖索引或(http://docs.mongodb.org/manual/reference/method/cursor.explain/#explain.nscannedObjects):
对于具有重复文档的数组字段上的多键索引。
"n" : 80,
这是退回的金额。
但是,这并不意味着您的排序效果很好,如第一个解释所示:
"scanAndOrder" : true,
答案 1 :(得分:1)
您的第一个查询很好 - 它使用索引查找存在的80个匹配项。 “n”是返回的文件数量; “nscannedRecords”是在查询期间扫描所需的数字(如果您有覆盖的查询,它可能小于“扫描”)。 “nscanned”是扫描的索引条目数(如果可以使用索引)。排序80条记录应该相当快;您没有可以使用的索引(来自您向我们展示的内容)。
第二个查询也很棒 - 它使用索引,并找到匹配的一个文档。
有关explain()的更多详细信息,请参阅http://docs.mongodb.org/manual/reference/method/cursor.explain/#explain-output-fields-core。