如何改善这些查询的性能?

时间:2011-03-19 15:14:37

标签: mysql ruby-on-rails ruby-on-rails-3 postgresql activerecord

我有一个很复杂的主页,其中显示公司,每个项目,有关最近事件的信息。他们的想法是,他们拥有一个数据密集型的信息中心,可以监控所有活动。

我很难让这个页面表现良好 - 两天前本地加载时间是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秒。

如何以最佳方式编写这些查询?索引应该在这种情况下发挥作用吗?

我一直在为视图中的循环查询使用数据库索引,但我还没有减少时间。

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