Mongo查询优化,可收集超过1000万条记录

时间:2020-06-23 13:35:22

标签: mongodb mongodb-query aggregation-framework aggregate query-optimization

我有一个拥有超过1000万条记录的馆藏,我需要与特定字段匹配并获得 记录集的不同_id。

在$ match流水线之后,结果集小于500万。 如果我与id分组以获得唯一的id,则在本地环境上的执行时间将超过20秒。

def startup_check():
    exp1_current_ip = get_exp_ip()
    if exp1_current_ip == False:
        while True:
            sleep(10)
            exp1_current_ip = get_exp_ip()
            if exp1_current_ip != False:
                break
    do_more(exp1_current_ip)
  • 如果我摆脱了$ match或$ group并且只有1个管道,则执行时间少于0.1秒。

我可以限制_id,但是它们应该是唯一的。

有人可以建议一种更好的方法来更快地获得结果吗?

1 个答案:

答案 0 :(得分:0)

您已经实现了最佳的聚合管道,以便查询获得所需的输出。

仅使用一个聚合管道时查询结果更快的原因是查询结果返回部分输出,而不是全部500万条记录。在您同时添加两个阶段时,$match阶段的整个输出必须由$group阶段进行处理,从而需要更多时间。

优化聚合查询的唯一方法是在MODULE_IDITEM_ID键上应用索引

db.viewscounts.createIndex({MODULE_ID: 1}, { sparse: true })
db.viewscounts.createIndex({ITEM_ID: 1})

viewscounts集合上执行以上两个索引后,应该更快。

此外,您还可以从MongoDB独特命令中获得所需的输出。尝试以下查询,看看是否有帮助。

db.getCollection('viewscounts').distinct("ITEM_ID", {"MODULE_ID": 4})

注意:上面的查询返回唯一键值数组,而不是像聚合查询中那样的对象

希望这会有所帮助

相关问题