【问题标题】:Odd MongoDB/Node Explain Results奇怪的 MongoDB/节点解释结果
【发布时间】:2015-01-07 23:04:48
【问题描述】:

我正在努力解决这个问题......任何帮助都会很棒。

我在 RoboMongo (CLI) 中运行的查询相同:

db.post.find({utc:{$lte:utc}})
.sort({utc:-1}).limit(100).hint({utc:-1})

和我的 Node 应用程序(使用本机驱动程序):

mo.post.find({utc:{$lte:utc}},{
  fields:{geo:0, bin:0, flg:0, mod:0, edt:0},
  hint:{utc:-1}, sort:{utc:-1}, limit:100
}).toArray(function(err, result)

由于某种原因,性能非常不同。顶部的运行时间不到 1 毫秒,底部的运行时间超过 100 毫秒。当我查看我得到的快速解释的“解释”时:

"cursor" : "BtreeCursor utc_-1",
    "isMultiKey" : false,
    "n" : 100,
    "nscannedObjects" : 100,
    "nscanned" : 100,
    "nscannedObjectsAllPlans" : 100,
    "nscannedAllPlans" : 100,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "utc" : [ 
            [ 
                ISODate("2015-01-07T00:47:32.786Z"), 
                true
            ]
        ]
    },

对于慢速的:

cursor: "BtreeCursor 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: {
utc: [1]
0:  [2]
0:  "2015-01-07T22:50:05.000Z"
1:  true
-
-
}-

有人知道这里会发生什么吗?他们使用相同的索引运行同一个数据库?

【问题讨论】:

  • 它们不能被解释为相同的查询 - 如果它们具有相同的 limit+skip 值,相同的查询应该产生相同的n。您能否仔细检查您是否获得了正确查询的解释?另外,时间信息是从哪里来的?
  • 这很奇怪 - 它是完全相同的查询 - 它会产生相同的结果。 N=1 解释没有意义,这就是永远的查询。两者都命中同一张表,时间来自 RoboMongo(快速查询)和 HTTP 客户端在较慢查询(通过本机节点驱动程序运行)时调用本地主机。
  • 我在这里也看到了古怪的行为:不同但可能相关? stackoverflow.com/questions/27831936/…
  • 你能在 mongo shell 中运行查询并发布解释吗?我对 RoboMongo 持怀疑态度,但我也不太了解。
  • 和 RoboMongo 一样。问题似乎是原生驱动解释:stackoverflow.com/questions/27844128/…

标签: javascript node.js mongodb database


【解决方案1】:

更新:好像是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(等等)。这会影响性能吗?当我运行 Limit = 1 的查询时,它很快(如预期的那样),但当 Limit = 2 时,它慢了 100 倍......

2015 年 1 月 8 日星期四上午 8:52:28 UTC-8,christkv 写道: 并不真地。我的建议是制作一个最小的可重现测试用例(代码和数据)并在 jira.mongodb.com 上开一张票。很难知道会发生什么。不太可能是司机,但永远不知道。尝试使用 1.4.x 分支,至少排除这是 2.0.x 分支问题。

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

UTC-8 时间 2015 年 1 月 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?

【讨论】:

    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2013-04-27
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多