我有大约。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
对象保存到内存中,因此只需要在第一行调用数据库?
MongoDB数据库不是为此构建的。
我认为最好的方法是每天运行一个脚本,创建当天的数据,并将其保存在Redis数据库http://www.redis.io
Redis将你的数据存储在服务器内存中,所以你可以在一天中的任何时候访问它。而且非常快
Don't Repeat Yourself (DRY)是一个最佳实践,不仅适用于代码,也适用于处理。许多应用程序都有用于汇总数据的自然周期,在您的问题中,一天是一个不错的选择,如果数据是历史数据,则只需汇总一次。这样就可以将处理1000万篇文章的文档减少到700天的概要文档。如果您想要当前准确的数据,您需要特殊的代码来合并,但是之前的节省是非常值得的。
我礼貌地不同意这种说法,"MongoDB数据库不是为此而构建的。"从上面可以看出,这都是关于不重复处理的。700天的总结文档可以存储在任何合理的数据存储中。由于您已经在使用MongoDB,所以只需使用另一个MongoDB集合进行日摘要。如果您不想启动另一个数据存储,则无需启动。摘要数据将很容易地适应内存,并且处理的减少意味着您的工作集大小将不再被历史处理吹走。