gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:12:37 24 4
gpt4 key购买 nike

我正在使用 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

所以检索第一个 block 需要 2 秒,第二个 0.1 秒,第三个 106 秒!!!诡异的..我尝试更改批处理大小,在 Date 和 IsClick 上创建索引,重新启动机器 :P 但没有办法。我哪里错了?

最佳答案

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

一些潜在的问题:

  1. 索引:您使用的索引是否正确?您可能应该在 IsClick/Date 上建立索引。这将范围放在第二位,这是正常的建议。请注意,这与 Date/IsClick 上的索引不同,顺序很重要。在您的查询中尝试 .explain() 以查看正在使用的索引。
  2. 数据大小:在某些情况下,缓慢可能是由于数据过多造成的。这可能是太多文档或太多大文档。它也可能是由于试图在一个非常大的大海捞针中找到太多针头造成的。您带回了 252k 数据 (reslen) 和 12k 文档,所以这可能不是问题所在。
  3. 磁盘 IO: MongoDB 使用内存映射文件,因此使用大量虚拟内存。如果您的数据多于 RAM,那么获取某些文档需要“转到磁盘”。转到磁盘可能是一项非常昂贵的操作。您可以使用 iostatresmon (Windows) 等工具来监视磁盘事件,从而识别“正在访问磁盘”。

根据个人经验,我强烈怀疑 #3,并且可能比 #1 恶化。我将从在运行 .explain() 查询时观察 IO 开始。这应该会迅速缩小可能出现问题的范围。

关于mongodb - 在合理的时间内使用 mongoDB 检索大量记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8154608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com