得到最后15个日期项目 - 任何优化方式?

时间:2011-04-10 20:49:01

标签: mysql ruby-on-rails

我有以下rails关联和命名范围:

class Person
  has_many :schedulings, :include => :event

class Scheduling
  belongs_to :person
  belongs_to :event
  named_scope :recent, :order => "date DESC", :limit => 15

class Event
  has_many :schedulings

我需要为一个人获得15个最近的调度。这是我的rails控制器代码,以及它生成的SQL查询:

Person.find(1).schedulings.recent
----
SELECT * FROM `schedulings` WHERE (`schedulings`.person_id = 1)  ORDER BY date DESC LIMIT 15

不幸的是,随着我的桌子大小的增长,这个查询变得越来越慢(目前大约有10K的调度和3K人)。

任何人都可以给我建议A)优化现有查询的方法,或者B)查询该信息的更直接的方法,可能使用直接SQL而不是Rails Active Record?

我的schedulings表在person_id上有一个外键索引,在日期上有一个索引。我在person_id和date上没有双重索引。通常,一个人每个日期不会有多个日程安排。

我对Rails很满意,但在SQL上却是一个相对新手。

2 个答案:

答案 0 :(得分:3)

在person_id和date上创建索引可以很好地加快代码的速度。

同样SELECT *通常也是糟糕的速度明智 只选择您实际要使用的字段 特别是如果你的表中有备忘录或blob字段,那么选择*会很慢。

答案 1 :(得分:1)

虽然你应该有一个关于该表(IMO)的键的索引,更重要的是对于这种情况,你应该在“date”字段上有一个索引,因为这就是你的意思通过...订购结果。

我总是喜欢在开发过程中使用rails_footnotes来查看我对给定视图所需的查询(以及多少)