【问题标题】:How to make distinct operation more quickly in mongodb如何在mongodb中更快地进行distinct操作
【发布时间】:2014-03-13 10:10:36
【问题描述】:

一个集合中有 30,000,000 条记录。 当我通过 java 对这个集合使用 distinct 命令时,大约需要 4 分钟,结果的计数约为 40,000。 mongodb的distinct操作就这么低效吗? 我怎样才能让它更有效率?

【问题讨论】:

    标签: mongodb distinct


    【解决方案1】:

    mongodb的distinct操作就这么低效吗?

    30m 记录?我会说 4 分钟其实相当不错,我认为这和 SQL 一样快,也许比 SQL 快一点。

    在说效率低之前,我可能会在其他数据库中对此进行测试。

    但是,查看性能的一种方法是查看该字段是否首先被索引,以及该索引是否在 RAM 中或可以在没有页面抖动的情况下加载。只要字段有索引,distinct() 就可以使用索引。

    我怎样才能提高效率?

    您可以使用几种方法:

    • 每 5 分钟将增量映射减少一次以区分主集合,以生成唯一集合
    • 并通过保存到两个集合(一个详细信息和一个唯一集合)在保存时预聚合唯一集合

    这是解决这个问题的两种最可行的方法。

    编辑

    Distinct() 并没有过时,如果它符合您的需求,它实际上比 $group 性能更高,因为它可以使用索引。

    【讨论】:

    • 好的,我在字段上加个索引,再试一次。非常感谢。
    【解决方案2】:

    .distinct() 操作是一个旧操作,.group() 也是如此。一般来说,这些已被.aggregate() 取代,通常应优先使用这些操作:

    db.collection.aggregate([
        { "$group": { 
           "_id": "$field",
           "count": { "$sum": 1 }
        }
    )
    

    用您希望从中获得不同计数的任何字段替换"$field"$ 为字段名称添加前缀以分配值。

    查看文档,尤其是 $group 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-08
      • 2019-11-22
      • 1970-01-01
      • 2015-12-19
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多