Performance 在合理的时间内使用mongoDB检索大量记录
我正在使用mongoDB存储一个querylog,并获取有关它的一些统计信息。 我存储在mongoDB中的对象包含查询文本、日期、, 用户,如果用户点击了一些结果等 现在,我试图检索用户在某一天内未单击的所有查询 使用java。我的代码大致如下: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
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
上建立索引不同,顺序很重要。请尝试解释()
查看正在使用的索引reslen
)和12k文档,所以这可能不是问题所在iostat
或resmon
(Windows)之类的工具来识别“转到磁盘”监视磁盘活动根据个人经验,我强烈怀疑#3,可能会从#1恶化。我会在运行
.explain()时从观察IO开始
query。这会很快缩小可能出现的问题的范围。您是否正确地迭代了所有项目,然后关闭了迭代器?谢谢,我刚刚意识到几个月前我的笔记本电脑出现了一个小故障:p磁盘上可能有问题。我正在另一台机器上尝试。不,在另一台机器上也有相同的行为,这是错误的有趣的是,同样的查询需要花费更多的时间(同样是秒数)。我知道在磁盘上运行会影响性能,但秒数的延迟是不可接受的。如果我将记录存储在普通文件中,我可以更快地计算统计数据!:)我将尝试使用索引。除了iostat
,Mongo提供了mongostat
过程,该过程显示(1)Mongo使用了多少RAM-resident
(2)页面错误和其他信息-