我有约。 Mongoid数据库中有1000万个Article
个对象。大量Article
个对象使查询执行起来非常耗时。
如下所示,我每周都会注册(例如从现在开始的700天......从现在开始的7天,从现在开始的0天),数据库中有多少篇文章。
但是对于我所做的每一个查询,时间消耗都会增加,而Mongoid的CPU使用率很快会达到+ 100%。
articles = Article.where(published: true).asc(:datetime)
days = Date.today.mjd - articles.first.datetime.to_date.mjd
days.step(0, -7) do |n|
current_date = Date.today - n.days
previous_articles = articles.lt(datetime: current_date)
previous_good_articles = previous_articles.where(good: true).size
previous_bad_articles = previous_articles.where(good: false).size
end
有没有办法将Article
对象保存到内存中,所以只需要在第一行调用数据库?
答案 0 :(得分:0)
MongoDB数据库不是为此而构建的。
我认为最好的方法是每天运行一个脚本,为当天创建数据并将其保存在Redis数据库中http://www.redis.io
Redis将您的数据存储在服务器内存中,因此您可以在每天的每个时间访问它。 并且很快。
答案 1 :(得分:0)
不要重复自己(DRY)是一种最佳做法,不仅适用于代码,也适用于处理。许多应用程序具有用于汇总数据的自然时代,在您的问题中,一天是一个不错的选择,如果数据是历史数据,则只需要汇总一次。因此,您将1000万条文档的处理减少到700天摘要文档。如果您想要获得准确的数据,那么今天需要使用特殊的代码进行合并,但以前的节省是非常值得的。
我礼貌地不同意这样的说法,“MongoDB数据库不是为此而构建的。”从上面可以看出,重要的是不重复处理。 700天摘要文档可以存储在任何合理的数据存储中。由于您已经在使用MongoDB,因此只需使用另一个MongoDB集合作为日期摘要。如果您不想,则无需启动另一个数据存储。摘要数据很容易适合内存,处理的减少意味着您的工作集大小将不再被历史处理所淹没。