Limit = 1 = 1ms,Limit> 1 = 150ms(mongo-melt-down)

使用MongoDB本地驱动程序,这里是查询:

mo.post.find({_us:_us, utc:{$lte:utc}},{ fields:{geo:0, bin:0, flg:0, mod:0, edt:0}, hint:{_us:1, utc:-1}, sort:{utc:-1}, limit:X, explain:true }).toArray(function(err, result){ if (err) {res.status(500).send(err);} else if (result.length > 0){res.status(200).json(result);} else {res.status(204).send();} }); 

当X(极限)为1时,响应时间约为1ms。 当我把它设置为2时,响应时间跳到+ 150ms。 咦……? 这两个查询的解释是相同的:

 cursor: "BtreeCursor _us_1_utc_-1" isMultiKey: false n: 1 nscannedObjects: 1 nscanned: 1 nscannedObjectsAllPlans: 1 nscannedAllPlans: 1 scanAndOrder: false indexOnly: false nYields: 0 nChunkSkips: 0 millis: 0 indexBounds: { _us: [1] 0: [2] 0: "54add9321656d4a9fa760b24" 1: "54add9321656d4a9fa760b24" - - utc: [1] 0: [2] 0: "2015-01-08T02:15:29.429Z" 1: true 

是的,他们都只显示1个扫描对象? 我的索引是否被打破? 即使当我将限制增加到X = 100时,响应时间仍然与X = 2几乎相同,并且解释是相同的,只是显示了1个扫描对象。 我不知道发生了什么事…? 在RoboMongo中运行这些确切的查询不到1ms。 那么,它可能是驱动程序? 或toArray?

任何帮助,将不胜感激…

似乎是2.0.x驱动程序的问题:这是一个线程…

我只用2.0.x和1.4.x运行完全相同的查询。 当Limit = 1时,两者都执行快速〜1ms。 当Limit = 2时,1.4.x版本停留在1ms左右,但2.0.x版本跳转到25ms。 所以,这不仅仅是解释输出的问题 – 这只是问题的一个症状。

2015年1月8日星期四上午9时04分05秒UTC-8,Joshua Abrams写道:有趣的…完全相同的查询使用1.4.x产生一个适当的解释,其中n = 2(依此类推)。 这可能会影响性能? 当我运行一个查询,其中限制= 1它是快速(如预期),但当限制= 2时,它是100倍慢…

2015年1月8日星期四上午8:52:28 UTC-8,christkv写道:不是真的。 我的build议是做一个最小的可重复的testing用例(代码和数据),并在jira.mongodb.com上打开一张票。 很难知道会发生什么。 这不可能是司机,但从来不知道。 尝试1.4.x的分支,以及至less排除这是一个2.0.x的分支问题。

在2015年1月8日星期四下午5:47:45 UTC + 1,Joshua Abrams写道:刚刚检查,我使用2.0.12的驱动程序。 任何其他的想法?

在2015年1月8日星期四8:23:16 UTC-8,christkv写道:解释只是重新调整驱动程序中的所有结果,而不是部分结果。 因此你得到了计划。 有一件事情可能是你在1.4.19以前的驱动程序中有一个batchSize被设置为1的错误。

2015年1月8日星期四下午05:01:42 UTC + 1,Joshua Abrams写道:我最近和司机一起遇到了一套性能问题。 Limit = 1 = 1ms,Limit> 1 = 150ms(mongo-melt-down)

不知道是什么原因造成的 – 当我无法得到正确的解释时,debugging是不可能的: MongoDB Native Node Driver:解释是破碎的?