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

时间:2018-05-23 15:55:48

标签: mongodb ruby-on-rails-4 mongodb-query

  

在我的应用程序中,我们在会话分析中记录用户活动   收集,到目前为止,我们的收藏有大约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可以处理大量数据。

1 个答案:

答案 0 :(得分:0)

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

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

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