【问题标题】:Mongo shell query timing out at 90 secondsMongo shell 查询超时 90 秒
【发布时间】:2015-11-18 10:55:48
【问题描述】:

我正在通过 mongo shell 使用 mongodb 来查询大型集合。由于某种原因,90 秒后 mongo shell 似乎停止了我的查询,并且没有返回任何内容。

我尝试了以下两个命令,但都不会返回任何内容。 90 秒后,它只给了我一个新行,我可以输入另一个命令。

db.cards.find("Field":"Something").maxTimeMS(9999999) db.cards.find("Field":"Something").addOption(DBQuery.Option.tailable)

db.cards.find() 返回结果,但是任何带有参数的东西都会在 90 秒时超时,并且没有返回任何内容。

任何帮助将不胜感激。

【问题讨论】:

  • 尝试使用db.cards.find().addOption(DBQuery.Option.noTimeout);。卡片集合中有多少文件?

标签: mongodb mongodb-query mongo-shell


【解决方案1】:

鉴于您问题的详细程度,我将重点关注“查询大型集合”,并猜测您使用的是 MMAPv1 存储引擎,而您的查询没有索引覆盖。

你的磁盘绑定了吗?

鉴于上述假设,您可以在 RAM 和磁盘之间循环数据。 Mongo 有一个默认的 100MB RAM 限制,因此如果您的查询必须检查大量文档(没有索引覆盖),则将数据从磁盘分页到 RAM 可能是罪魁祸首。我听说过 mongo shell 按照您的描述执行或在超出内存限制时锁定/终止。

32 位系统还可以对大型集合施加严格的内存限制。

您可以查看特定于操作系统的磁盘活动监视器,以了解这是否是您的问题。

您的收藏有多大?

接下来,您的收藏有多大?您可以show collections 查看收藏的实际大小,也可以db.cards.count() 查看您的记录数。这有助于量化“大集合”。

注意:您可能需要 mongo-hacker 扩展程序才能查看显示集合中的集合磁盘使用情况。

Mongo shell 调查

在 mongo shell 中,您还有几个地方可以查看。 默认情况下,mongo 将记录慢查询(> 100 毫秒)。 90 秒超时后:

db.adminCommand({getLog: "global" })

并查找慢查询日志条目。

接下来看看你的获胜查询计划。

var e = db.cards.explain()
e.find("Field":"Something")

我猜你会看到

"stage": "COLLSCAN",

这意味着您正在进行完整的集合扫描,并且您的查询需要索引覆盖(查询和排序的好主意)。

建议

您应该对任何生产查询至少有部分索引覆盖。一个适当的索引应该可以解决您的问题(假设您没有大于 16MB 的文档)。

另一种方法(我不推荐 - 索引更好)是使用游标代替

var cursor = db.cards.find("Field":"Something")
while (cursor.hasNext()) {
  print(tojson(cursor.next()));
}

根据根本原因,这可能对您有用。

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多