我有以下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


不幸的是,随着我的表大小的增加,这个查询变得越来越慢(目前大约有1万个调度程序和3K人)。

任何人都可以就A)优化现有查询的方式或B)查询信息的更直接方式(也许使用直接SQL而非Rails Active Record)提供建议吗?

我的调度表在person_id上有一个外键索引,在日期上有一个索引。我在person_id和date上没有双重索引。通常,一个人每个日期最多只能安排一个时间表。

我对Rails感到满意,但对SQL还是一个​​相对新手。

最佳答案

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

同样,SELECT *通常不是一个明智的速度选择。
仅选择您实际要使用的字段。
特别是如果您的表中有备忘或Blob字段,则select *将变得很慢。

10-08 13:36