23rd Mar, 2009

使用rails_reviewer优化Rails数据库查询性能

最近在做的一个项目遇到严重的性能问题,主要是数据库查询过多,同事向我推荐了rails_reviewer插件,它是我的前同事(不确定我进公司时他还在不在) David Stevenson 写的一个帮助你优化SQL查询的插件,它可以帮助你定位数据库查询的瓶颈所在,从而通过编制索引已经缓存关键变量来改进性能。

rails_reviewer的安装很简单:

$ script/plugin install git://github.com/dsboulder/query_reviewer.git
$ rake query_reviewer:setup

现在重启服务器,你就会在屏幕的左上角看到一个小窗口,点击这个窗口,就会显示加载当前页面的所有SQL查询,并且会告诉你那些是没问题的,那些是需要优化的,如下图:

picture-1.png

可以看到,在优化前这个请求执行了1101条SQL查询,并且大部分都是没有cache的,你可以通过rails_reviewer查看每条查询的SQL语 句以及代码的调用栈,优化主要从两方面进行,一个是提高查询性能,这个可以通过添加索引,另一个就是减少查询数量,这个可以通过缓存变量,比如:


def production(name)
  @production_cache ||= {}
  @production_cache[name] ||= buildings.map{|b| b.production(name)}.sum
end

下面是优化后的结果,可以看到,优化后查询数从1101变成了94,时间则从800多毫秒减到了59毫秒,大约只有原来的10分之一不到:

picture-2.png

评论

缓存变量(中间结果)可以用 memoization 来处理(不过有人作了benchmark后指出还是手工写的比较快一些)。

感谢推荐,抽空试验一下,不过看你的结果优化前后差距很明显啊

留条评论?

Your response:

Categories