如何在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查询?的主要内容,如果未能解决你的问题,请参考以下文章