Mongo shell查询超时90秒

时间:2015-08-24 21:34:14

标签: mongodb mongodb-query mongo-shell

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

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

db.cards.find("现场":"东西&#34)maxTimeMS(9999999)。 db.cards.find("现场":"东西&#34)。addOption(DBQuery.Option.tailable)

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

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

你是否受磁盘约束?

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

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

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

你的收藏有多大?

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

注意:您可能需要使用mongo-hacker扩展来查看show collection中的集合磁盘。

Mongo shell调查

在mongo shell中,你还有几个值得一看的地方。 默认情况下,mongo将记录慢速查询(> 100ms)。 90秒超时后:

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

并查找慢查询日志条目。

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

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

我猜你会看到

"stage": "COLLSCAN",

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

<强>建议

您应该至少对任何生产查询具有部分索引覆盖率。正确的索引应该可以解决您的问题(假设您没有文件&gt; 16MB)。

另一种方法(我不建议 - 索引更好)是使用游标

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

根据根本原因,这可能适合您。