【发布时间】:2011-03-19 15:14:36
【问题描述】:
我有一个很长很复杂的主页,其中显示了一个公司,对于每个项目,有关最近事件 的信息。他们的想法是他们有一种数据密集型信息中心,他们可以从中监控所有活动。
我无法让此页面正常运行 - 两天前,本地加载时间为 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 秒。
应该如何以最佳方式编写这些查询?在这种情况下,索引应该发挥作用吗?
我一直在为视图中的循环查询使用数据库索引,但我还没有找到一个来缩短时间。
【问题讨论】:
-
你能发布表创建脚本吗?也通过mysql运行语句,并给我们解释计划。
-
@dmcnelis - 表创建脚本是指创建公司/项目/事件表的原始迁移吗?
-
我刚刚用
logger.debugs 包围了视图查询,两者之间的日志中没有任何内容!这是负载报告:Completed 200 OK in 1480ms (Views: 310.7ms | ActiveRecord: 19.8ms)。当 Views + AR =~ 330ms 时,负载是 1.5s... -
我的开发环境日志显示没有超过 5 毫秒的查询,包括从视图运行的所有查询。每个的性能似乎都很好,但删除上面的块仍然会产生巨大的改进......
-
1000 个 5ms 查询是 5s。我发现 ActiveRecord 有一个坏习惯,即当一个带有适当连接的大查询更有意义时,它会执行大量单行查询。每个
project.events.where()会产生多少次查询,您会通过.each进行多少次查询?
标签: mysql ruby-on-rails ruby-on-rails-3 postgresql activerecord