Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在合理的时间内使用mongoDB检索大量记录_Performance_Mongodb_Cursor_Mongodb Java - Fatal编程技术网

Performance 在合理的时间内使用mongoDB检索大量记录

Performance 在合理的时间内使用mongoDB检索大量记录,performance,mongodb,cursor,mongodb-java,Performance,Mongodb,Cursor,Mongodb Java,我正在使用mongoDB存储一个querylog,并获取有关它的一些统计信息。 我存储在mongoDB中的对象包含查询文本、日期、, 用户,如果用户点击了一些结果等 现在,我试图检索用户在某一天内未单击的所有查询 使用java。我的代码大致如下: DBObject query = new BasicDBObject(); BasicDBObject keys = new BasicDBObject(); keys.put("Query", 1); query.pu

我正在使用mongoDB存储一个querylog,并获取有关它的一些统计信息。 我存储在mongoDB中的对象包含查询文本、日期、, 用户,如果用户点击了一些结果等

现在,我试图检索用户在某一天内未单击的所有查询 使用java。我的代码大致如下:

    DBObject query = new BasicDBObject();
    BasicDBObject keys = new BasicDBObject();
    keys.put("Query", 1);
    query.put("Date", new BasicDBObject("$gte", beginning.getTime()).append("$lte", end.getTime()));
    query.put("IsClick", false);
    ...
    DBCursor cur = mongoCollection.find(query, keys).batchSize(5000);
查询的输出包含我需要迭代的大约20k条记录。 问题是需要几分钟:(。我认为这不正常。 从服务器日志中,我看到:

Wed Nov 16 16:28:40 query db.QueryLogRecordImpl ntoreturn:5000 reslen:252403 nscanned:59260 { Date: { $gte: 1283292000000, $lte: 1283378399999 }, IsClick: false }  nreturned:5000 2055ms
Wed Nov 16 16:28:40 getmore db.QueryLogRecordImpl cid:4312057226672898459 ntoreturn:5000 query: { Date: { $gte: 1283292000000, $lte: 1283378399999 }, IsClick: false }  bytes:232421 nreturned:5000 170ms
Wed Nov 16 16:30:27 getmore db.QueryLogRecordImpl cid:4312057226672898459 ntoreturn:5000 query: { Date: { $gte: 1283292000000, $lte: 1283378399999 }, IsClick: false }  bytes:128015 nreturned:2661 --> 106059ms
所以检索第一个块需要2秒,第二个0.1秒,第三个106秒!!!奇怪。。
我试着改变批量大小,在Date和IsClick上创建索引,重新启动机器:P但没有办法。我错在哪里?

这里有几个因素会影响速度。有必要收集一些额外的数据来确定原因

一些潜在问题:

  • 索引:您是否使用了正确的索引?您可能应该在
    IsClick/Date
    上建立索引。这会将范围放在第二位,这是正常的建议。请注意,这与在
    Date/IsClick
    上建立索引不同,顺序很重要。请尝试
    解释()
    查看正在使用的索引
  • 数据大小:在某些情况下,速度缓慢可能是由于数据太多。这可能是因为文档太多或大型文档太多。也可能是因为试图在一个真正大的草堆中找到太多的针。您将带回252k的数据(
    reslen
    )和12k文档,所以这可能不是问题所在
  • 磁盘IO:MongoDB使用内存映射文件,因此使用大量虚拟内存。如果数据多于RAM,则获取某些文档需要“转到磁盘”。转到磁盘可能是一项非常昂贵的操作。您可以使用诸如
    iostat
    resmon
    (Windows)之类的工具来识别“转到磁盘”监视磁盘活动

  • 根据个人经验,我强烈怀疑#3,可能会从#1恶化。我会在运行
    .explain()时从观察IO开始
    query。这会很快缩小可能出现的问题的范围。

    您是否正确地迭代了所有项目,然后关闭了迭代器?谢谢,我刚刚意识到几个月前我的笔记本电脑出现了一个小故障:p磁盘上可能有问题。我正在另一台机器上尝试。不,在另一台机器上也有相同的行为,这是错误的有趣的是,同样的查询需要花费更多的时间(同样是秒数)。我知道在磁盘上运行会影响性能,但秒数的延迟是不可接受的。如果我将记录存储在普通文件中,我可以更快地计算统计数据!:)我将尝试使用索引。除了
    iostat
    ,Mongo提供了
    mongostat
    过程,该过程显示(1)Mongo使用了多少RAM-
    resident
    (2)页面错误和其他信息-