【发布时间】:2011-11-16 15:56:57
【问题描述】:
我正在使用 mongoDB 来存储查询日志并获取有关它的一些统计信息。 我存储在 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 但没办法。我哪里错了?
【问题讨论】:
-
您是否正确地迭代所有项目然后关闭迭代器?
标签: mongodb performance mongodb-java database-cursor