我有以下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 *将变得很慢。