2017-01-24 82 views
0

我正在计算用户访问webapp的平均会话。 每次访问页面都会在我的数据库中创建访问记录。Rails中的平均会话计算

现在有~40000个vistis有10000个个人代币,所以我的计算时间很长。 有人提出了一个想法来提高计算平均会话的速度吗?

现在我正在收集uniqe令牌。然后我查找每个标记的第一次和最后一次访问来计算差异。

diff = 0 
token = self.visits.where(created_at: self.statistic_range).pluck(:token).uniq 

token.each do |tok| 
    visits = self.visits.where(created_at: self.statistic_range, token: tok).order('updated_at asc') 
    diff += (visits.last.created_at - visits.first.created_at).round 
end 
return diff/token.size 

回答

0

您在这里有n + 1个查询问题。您的代码正在进行10,000 + 1个单独的SQL查询。

为什么不尝试获取所有访问一次并将它们存储在一个数组中,然后在内存中进行计算。

visits = self.visits.where(created_at: self.statistic_range).to_a 
token = visits.pluck(:token).uniq 
... 

这显然会吃掉很多RAM和CPU,但很可能它不会像运行10,001个SQL查询一样糟糕。