0

我有大约。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对象保存到内存中,所以只需要在第一行调用数据库吗?

4

2 回答 2

0

MongoDB 数据库不是为此而构建的。

我认为最好的方法是每天运行一个脚本来创建当天的数据并将其保存在 Redis 数据库http://www.redis.io

Redis 将您的数据存储在服务器内存中,因此您可以在一天中的每个时间访问它。并且非常快。

于 2014-03-10T15:34:12.777 回答
0

不要重复自己 (DRY) 是一种最佳实践,不仅适用于代码,也适用于处理。许多应用程序都有汇总数据的自然时期,在您的问题中一天是一个不错的选择,如果数据是历史数据,则只需汇总一次。因此,您可以将 1000 万篇文章文档的处理减少到 700 篇日摘要文档。如果您想要最新的准确数据,您今天需要特殊的代码来合并,但是之前的节省是值得的。

我礼貌地不同意这种说法,“MongoDB 数据库不是为此而构建的。” 从上面可以看出,一切都是为了不重复处理。700 天摘要文档可以存储在任何合理的数据存储中。由于您已经在使用 MongoDB,因此只需使用另一个 MongoDB 集合作为每日摘要。如果您不想这样做,则无需启动另一个数据存储。汇总数据将很容易放入内存中,处理量的减少意味着您的工作集大小将不再被历史处理所淹没。

于 2014-04-25T14:18:33.157 回答