2017-01-24 21 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查詢一樣糟糕。