限制= 1 = 1毫秒,限制> 1 = 150毫秒(mongo-melt-down)

时间:2015-01-08 02:17:31

标签: javascript node.js mongodb database

使用MongoDB Native Driver,这是查询:

  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中运行时,这些确切的查询需要不到1毫秒。那么,它可能是司机吗?或者到阿雷?

任何帮助将不胜感激......

1 个答案:

答案 0 :(得分:0)

似乎是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日星期四UTC-8上午9:04:05,Joshua Abrams写道: 有趣的...使用1.4.x的完全相同的查询产生正确的解释,其中n = 2(依此类推)。这会影响性能吗?当我运行一个Limit = 1的查询时,它的速度很快(正如预期的那样),但是当Limit = 2时,速度会慢100倍......

2015年1月8日星期四UTC-8上午8:52:28,christkv写道: 并不是的。我的建议是制作一个可重复性最小的测试用例(代码和数据)并在jira.mongodb.com上打开一张票。有点难以知道会发生什么。它不太可能是驱动程序,但人们永远不会知道。尝试1.4.x分支以及至少排除它是2.0.x分支问题。

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

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

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

不确定根源是什么 - 当我无法得到正确的解释时,无法进行调试: MongoDB Native Node Driver: Explain is Broken?