我有一个很复杂的主页,其中显示公司,每个项目,有关最近事件的信息。他们的想法是,他们拥有一个数据密集型的信息中心,可以监控所有活动。
我很难让这个页面表现良好 - 两天前本地加载时间是4.5秒(!),它们目前处于~2.5秒(!)。关于这种可怕表现的最令人震惊的部分是,这些只是3个项目的加载时间,几乎没有任何事件。实时应用程序的性能略好一些,但还不够。
以下是当前的查询。
# controller
@projects = @company.projects.order("project_title ASC").includes({:events => :owner}).search(params[:search], params[:page])
# view
@projects.each do |project|
@events = project.events.where(:active => true).includes(:owner).order("priority DESC")
end
删除.where(:active => true).includes(:owner).order("priority DESC")
仅在3个项目和4个事件的应用程序上削减了1.1秒。
如何以最佳方式编写这些查询?索引应该在这种情况下发挥作用吗?
我一直在为视图中的循环查询使用数据库索引,但我还没有减少时间。
答案 0 :(得分:3)
您的.includes(:events =>:所有者)没有按照您的想法行事,就像您调用。之后的事件,您必须再次从数据库中检索。
此外,如果您的搜索方法使用的是事件和所有者表,您可能希望使用.joins()而不是.includes()。
我会确保每个外键(xxx_id)和活动事件都有索引。
我也会试一试(不确定它是否有效,可能需要一些调整):
class Project < AR::Base
has_many :events
has_many :active_events,
:class_name => 'Event',
:conditions => {:active => true},
:order => "events.priority DESC"
:include => :owner
end
#in controller:
@projects = @company.projects.order("project_title ASC").includes(:active_events).search(...)
#in view: (abstract this to a render collection method if possible)
@project.each do |project|
@events = project.active_events
end