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

标签 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 时,响应时间会跳到 +150 毫秒。咦……?两个查询的解释是相同的:

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 毫秒。那么,这可能是司机吗?还是 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 日星期四 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?

关于javascript - Limit = 1 = 1ms, Limit > 1 = 150ms (mongo-melt-down),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27831936/

相关文章:

mysql - 通过 ssl 与 mysql 的握手错误

javascript - 如何在不改变对象的情况下更改对象的属性?

node.js - 如何在 Cassandra + AWS Lambda 中处理超时

node.js - 使用 Nodejs 提供 MP4 视频文件

mongodb - MongoID:分组和计数

mongodb - Elasticsearch 模糊搜索根和嵌套字段

javascript - 如何使用 longblob 列将输入图像保存在数据库中?

javascript - 为什么在使用 setRequestHeader 制作 xmlhttprequest 时无法设置 cookie 和 set-cookie header ?

javascript - React.js Chrome 扩展 - 如何将来自 Background.js 的数据存储在 React 中的变量中?

node.js - Firebase 提供 --only 功能,admin.auth() 在本地不起作用,除非我手动设置 key.json