减少查询 - 关联的条件?

时间:2011-03-21 01:18:30

标签: mysql ruby-on-rails

我需要一些帮助来优化以下方法。随着我的数据库大小增加到3K用户和100K锻炼,查询变得太昂贵了。不幸的是,我的SQL技能还不成熟。

该方法返回给定锻炼的等级与同一性别的人的其他锻炼,以及该性别的锻炼总数。为简化此示例,我已删除了其他适用的训练条件:

Class Person
  has_many :workouts
  named_scope :men, :conditions => {:male => true}
end

Class Workout
  belongs_to :person
  named_scope :by, lambda {|person_id| {:conditions => {:person_id => person_id}}}

  def rank_by_gender
    people = Person.men.collect{|p| p.id}
    { :place => 
        Workout.by(people).count(:conditions => ["time < ?", self.time]) + 1
      :entries => 
        Workout.by(people).count() }
  end
end 
  • Person.men现在返回数千条记录。有没有办法将该查询与计数查询相结合,可能是通过在people表上使用:male属性?

  • 有没有办法将Person关联中的条件放入传递给count方法的条件中?

  • 除此之外,有没有人在这种方法中看到减少数据库查询大小和时间的其他方法?

1 个答案:

答案 0 :(得分:1)

这应该适合你:

  { 
    :place => Workout.joins(:person).where(["`workouts`.time < ? AND `people`.male = ?", self.time, true]).size,
    :entries => Workout.joins(:person).where(:people => {:male => true}).size 
  }