如何通过避免多次查询Mongoid来提高性能



我有大约。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集合进行日摘要。如果您不想启动另一个数据存储,则无需启动。摘要数据将很容易地适应内存,并且处理的减少意味着您的工作集大小将不再被历史处理吹走。

最新更新