Rails中平均会话的计算

时间:2017-01-24 17:00:08

标签: ruby-on-rails

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

现在有大约40000个vistis,10000个单独的令牌,所以我的计算需要很长时间。 有人有想法提高计算平均会话的速度吗?

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

UPDATE oc_product_option_value_dimension SET dimension_prefix = '='     WHERE dimension_prefix IS NULL IN(
SELECT `dimension_prefix`,`length`,`width`,`height`,ovd.`name`,p.`product_id`,pov.product_option_value_id

FROM ( SELECT product_id FROM `oc_product` ORDER BY product_id ASC) AS p
LEFT JOIN `oc_product_option_value` pov ON     pov.product_id=p.product_id 
LEFT JOIN `oc_product_option_value_dimension` povd ON povd.product_option_value_id=pov.product_option_value_id
LEFT JOIN `oc_option_value_description` ovd ON ovd.option_value_id=pov.option_value_id
LEFT JOIN `oc_option_description` od ON od.option_id=ovd.option_id
WHERE ovd.`name` regexp '^[0-9]+')

1 个答案:

答案 0 :(得分: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查询一样糟糕。