如何在30M左右的大集合上优化mongo查询?

问题描述 投票:0回答:1

在我的应用程序中,我们在会话分析集合中记录用户活动,到目前为止,我们的集合中有大约30M的记录,主要是在2018年2月到2018年5月创建的20M。当我们计算在给定时间段内的活跃用户,即2018年1月1日到2018年5月20日,服务器返回超时错误,因为查询在60+秒内执行。我们在Rails和我的查询中的应用程序是

> `SessionAnalytic.collection.aggregate([
{
  "$match" => {
    "start_date" => {
      "$gte" => options[:start_date],
      "$lte" => options[:end_date]
    },
    "community_uuid" => options[:community_uuid],
    "user_type"      => options[:user_type]
  }
},
{"$group": {"_id": "$user_uuid" } },
{"$count": 'total_users' }
]).first`

在community_uuid,user_type和start_date字段上有索引。任何人都可以建议为什么花费大量时间执行。据我所知,MongoDB可以处理大量数据。

mongodb ruby-on-rails-4 mongodb-query
1个回答
0
投票

我不是MongoDB专家,但我知道SQL索引是如何工作的,它应该非常相似。

在我看来,30M是大量的记录,但Mongo应该处理它 - 但它又取决于它。最重要的问题是,您是否有包含3个字段或3个分隔索引的单个索引? - 你应该有一个包含3个字段(甚至4个)的索引。此索引还应包含$ user_uuid字段。为什么?因为它在group by子句中使用,所以如果$ user_uuid没有被索引,那么在匹配之后MongoDB需要从源集合中为每条记录获取$ user_uuid - 而且它会很慢。

如果它仍然无法工作,那么我会写一些代码,每天聚合所有用户的所有活动,并更改您的查询,以便使用预先分组的数据。

© www.soinside.com 2019 - 2024. All rights reserved.