【问题标题】:Better Performance on Associations更好的关联表现
【发布时间】:2009-02-04 02:30:48
【问题描述】:

现在我有一个名为 Campaigns 的表,它有很多 Hits,如果我打电话说:

Campaign.find(30).hits

这需要 4 秒,即 4213 毫秒。

如果我改为调用它:

广告系列 = Campaign.find(30) 广告系列点击数

它是否仍会加载所有点击数,然后计数?或者它是否看到我正在计数并避免加载所有点击? (目前有 300,000 多行)。

我试图找出一种聪明的方法来加载/计算我的点击量。我正在考虑向我的 Campaign.rb 模型添加一个方法,例如:

def self.total_hits find :first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.id] 结尾

我知道查询不会从 hits 表中加载,但这只是从自制查询中计算它的一个示例,与 Ruby on Rails 为我做这件事相反。

这个 memcache 查询会更有效吗? (我让它运行,但似乎没有更好/更快/更慢,只是速度相同。)

def self.hits Rails.cache.fetch("Campaign_Hits_#{self.campaign_id}", :expires_in => 40) { find(:first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.campaign_id]).hits } 结尾

任何建议都会很棒!

【问题讨论】:

    标签: ruby-on-rails activerecord associations


    【解决方案1】:

    怎么样:

    Campaign.find(30).hits.count
    

    您还可以考虑在hit.rb 中添加以下内容(假设广告系列和点击之间是一对多的关系)。

    belongs_to :campaign, :counter_cache => true
    

    然后您需要在campaigns 表中有一列称为hits_count。如果您只获得计数,这将完全避免点击hits

    您可以查看API 以获得完整的概要。

    【讨论】:

    • 未定义的错误,它不应该知道找到30个ID。
    【解决方案2】:

    我的 ActiveRecord 可能有点生锈,如果是这样,请原谅我,但 IIRC Campaign.find(30).hits 至少是两个单独的查询。 Campaign.find(30, :include => [ :hits ]).hits 是怎么做的?这应该执行一个查询。

    【讨论】:

    • 我相信在这种情况下它会做同样的事情。无论如何,两个查询在这里会更有效,因为您不希望它 LEFT JOIN 所有点击到活动行。基本上你只需要“WHERE campaign_id = 30”
    猜你喜欢
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多