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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在30M左右的大集合上优化mongo查询?相关的知识,希望对你有一定的参考价值。

在我的应用程序中,我们在会话分析集合中记录用户活动,到目前为止,我们的集合中有大约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专家,但我知道SQL索引是如何工作的,它应该非常相似。

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

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

以上是关于如何在30M左右的大集合上优化mongo查询?的主要内容,如果未能解决你的问题,请参考以下文章

Mongo突然忽略大集合中的索引

MongoDB如何优化查询性能?

如何优化mysql中的大表?

mongo大数据量查询优化

用于收集超过 1000 万条记录的 Mongo 查询优化

ORACLE中这个运行4秒左右的SQL语句如何优化?我想查询少用点时间