MongoDB - 查询超过1000万条记录的性能

时间:2014-05-21 09:02:33

标签: mongodb performance indexing nosql

首先:我已经根据MongoDB查询性能阅读了很多帖子,但我没有找到任何好的解决方案。

在集合内部,文档结构如下所示:

{
    "_id" : ObjectId("535c4f1984af556ae798d629"),
    "point" : [
        -4.372925494081455,
        41.367710205649544
    ],
    "location" : [
        {
            "x" : -7.87297955453618,
            "y" : 73.3680160842939
        },
        {
            "x" : -5.87287143362673,
            "y" : 73.3674043270052
        }
    ],
    "timestamp" : NumberLong("1781389600000")
}

我的收藏品已有索引:

db.collection.ensureIndex({timestamp:-1})

查询看起来像:

db.collection.find({ "timestamp" : { "$gte" : 1380520800000 , "$lte" : 1380546000000}})

尽管如此,响应时间过长,大约20-30秒(此时间取决于指定的查询参数)

任何帮助都很有用!

提前致谢。

编辑:我更改了查找参数,用实际数据替换了这些参数。

上述查询需要46秒,这是explain()函数给出的信息:

{
    "cursor" : "BtreeCursor timestamp_1",
    "isMultiKey" : false,
    "n" : 124494,
    "nscannedObjects" : 124494,
    "nscanned" : 124494,
    "nscannedObjectsAllPlans" : 124494,
    "nscannedAllPlans" : 124494,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 45,
    "nChunkSkips" : 0,
    "millis" : 46338,
    "indexBounds" : {
        "timestamp" : [
            [
                1380520800000,
                1380558200000
            ]
        ]
    },
    "server" : "ip-XXXXXXXX:27017"
}

1 个答案:

答案 0 :(得分:9)

解释输出不可能更理想。您通过索引(nscanned)找到了124,494个文档,它们都是有效的结果,因此它们都被返回(n)。它仍然不是仅索引查询,因为边界不是特定文档中的确切值。

这个查询有点慢的原因可能是它返回的大量数据。您找到的所有文件必须从硬盘驱动器(当收集冷藏时)读取,扫描,序列化,通过网络发送到客户端并由客户端反序列化。

您真的需要那么多数据用于您的用例吗?如果答案是肯定的,那么回应真的重要吗?我不知道你真正想要创建什么样的应用程序,但我猜测你的是三个用例之一:

  1. 您希望以某种报告的形式显示所有数据。这意味着输出将是用户必须滚动的巨大列表。在这种情况下,我会建议使用分页。只在一个屏幕上加载适合的数据并提供nextprevious按钮。 MongoDB分页可以使用游标方法.limit(n).skip(n)
  2. 完成
  3. 以上,但它是用户可以下载的某种离线报告,然后用各种数据挖掘工具进行检查。在这种情况下,初始加载时间是可以接受的,因为用户将花费一些时间处理他们收到的数据。
  4. 您不希望向用户显示所有原始数据,而是处理它并以某种聚合方式呈现它,如统计信息或图表。在这种情况下,您可能已经使用聚合框架在数据库上完成了所有工作。