如果我使用explain()从shell运行一个mongo查询,获得所用索引的名称,然后再次运行相同的查询,但是使用hint()指定要使用的相同索引-- explain plan中的"millis“字段会显著减少
例如
未提供任何提示:
>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain();
{
"cursor" : "BtreeCursor my_super_index",
"nscanned" : 599,
"nscannedObjects" : 587,
"n" : 3,
"millis" : 24,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : { ... }
}
提供的提示:
>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain();
{
"cursor" : "BtreeCursor my_super_index",
"nscanned" : 599,
"nscannedObjects" : 587,
"n" : 3,
"millis" : 2,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : { ... }
}
唯一的区别是"millis“字段
有人知道这是为什么吗?
更新:“选择使用哪个索引”不能解释它,因为据我所知,mongo为每个X选择索引(100?)运行,因此它应该与提示下一次(X-1)运行一样快
发布于 2013-02-21 19:22:23
Mongo使用一个算法来确定在没有提供提示的情况下使用哪个索引,然后将用于类似查询的索引缓存到下1000个调用中
但是,无论何时解释mongo查询,它都会运行索引选择算法,因此,与不使用提示的explain()相比,带提示的explain()花费的时间总是更少。
这里回答了类似的问题Understanding mongo db explain
发布于 2012-03-28 03:28:31
Mongo进行了两次相同的搜索,从扫描对象的数量可以看出。您还可以看到使用的索引是相同的(看一下"cursor“条目),两者都已经使用了您的my_super_index索引。
“提示”只告诉Mongo使用特定的索引,它已经在第一个查询中自动使用了该索引。
第二次搜索更简单,更快,因为所有数据可能都已经在缓存中了。
发布于 2012-08-21 16:19:32
我为同样的事情挣扎着寻找理由。我发现当我们有很多索引时,mongo确实比使用hint花费了更多的时间。Mongo基本上花了很多时间来决定使用哪个索引。想象一下这样一个场景:您有40个索引,然后执行查询。Mongo需要做的第一个任务是哪个索引最适合用于特定的查询。这意味着mongo需要扫描所有的键,并在每次扫描中进行一些计算,以找到一些性能指标,如果使用这个键的话。提示肯定会加速,因为索引键扫描将被保存。
https://stackoverflow.com/questions/7730591
复制相似问题