【问题标题】:How to speed up performance by avoiding to query Mongoid multiple times?如何通过避免多次查询 Mongoid 来提高性能?
【发布时间】:2014-04-13 15:27:13
【问题描述】:

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

【问题讨论】:

    标签: performance mongodb mongoid querying mongoid4


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 1970-01-01
        相关资源
        最近更新 更多