Mysql 减少查询-关联条件?
我需要一些帮助来优化以下方法。随着我的数据库规模扩大到3K用户和100K训练,查询成本变得太高。不幸的是,我的SQL技能还很初级 该方法返回给定训练相对于同性别的训练的排名,以及该性别的训练总数。为了简化此示例,我删除了其他适用于训练的条件:Mysql 减少查询-关联条件?,mysql,ruby-on-rails,Mysql,Ruby On Rails,我需要一些帮助来优化以下方法。随着我的数据库规模扩大到3K用户和100K训练,查询成本变得太高。不幸的是,我的SQL技能还很初级 该方法返回给定训练相对于同性别的训练的排名,以及该性别的训练总数。为了简化此示例,我删除了其他适用于训练的条件: Class Person has_many :workouts named_scope :men, :conditions => {:male => true} end Class Workout belongs_to :pers
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
班级人员
有很多:锻炼
命名的_作用域:men,:conditions=>{:male=>true}
结束
课堂锻炼
属于某人
命名为_scope:by,lambda{| person_id{:conditions=>{:person_id=>person_id}}
按性别划分的def等级
人=人。人。收集{p{p.id}
{:place=>
锻炼。按(人)。计数(:条件=>[“时间<?”,自我时间])+1
:条目=>
Workout.by(people).count()}
结束
结束
- Person.men现在返回数千条记录。有没有一种方法可以将该查询与count查询结合起来,可能是在people表上使用一个连接,并在:male属性上使用
- 是否有方法将人员关联的条件放入传递给count方法的条件中
- 除此之外,有没有人看到其他方法可以减少此方法中数据库查询的大小和时间
{
:place => Workout.joins(:person).where(["`workouts`.time < ? AND `people`.male = ?", self.time, true]).size,
:entries => Workout.joins(:person).where(:people => {:male => true}).size
}
{
:place=>Workout.joins(:person)。其中([“`workouts`.time<>和`people`.male=?”,self.time,true])大小,
:entries=>Workout.joins(:person).where(:people=>{:male=>true}).size
}
这应该适合您:
{
:place => Workout.joins(:person).where(["`workouts`.time < ? AND `people`.male = ?", self.time, true]).size,
:entries => Workout.joins(:person).where(:people => {:male => true}).size
}
{
:place=>Workout.joins(:person)。其中([“`workouts`.time<>和`people`.male=?”,self.time,true])大小,
:entries=>Workout.joins(:person).where(:people=>{:male=>true}).size
}
谢谢。忘了提及我的应用程序仍然停留在rails 2.2上,但很容易将语法更改为“训练”。所有(:joins=>:person,:conditions=>[…])因为我需要的只是计数,这就是我完成的:训练。计数(:joins=>:person,:conditions=>[…])拍摄,我本想在这些内容的末尾加上.size()。谢谢。忘了提及我的应用程序仍然停留在rails 2.2上,但很容易将语法更改为“训练”。所有(:joins=>:person,:conditions=>[…])因为我需要的只是计数,这就是我完成的:训练。计数(:joins=>:person,:conditions=>[…])拍摄,我本想在这些内容的末尾加上.size()。