12

如果您的Rail应用程序具有许多复杂的关联模型,那么您采用了什么技术来减少数据库查询?用于减少Rails应用程序中的数据库查询的技术

事实上,我会进一步延伸这个问题,并问,你认为对于任何页面“太多”的查询是什么?

我有一个页面,我期望最终将达到每个页面加载20次的数据库。这涉及到但不知道它是否应该关注我,或者我能做些什么来减轻负载?

回答

14

退房:bullet

它是一种伟大的方式来识别N + 1个查询并提供建议,以尽量减少它。

它确实减慢了开发模式,所以一定要在不进行性能调整时禁用它。

虽然我们在这,也签:rails_indexes

一种简单的方法,以确定您的应用程序可能缺少哪些索引。

快乐调校。

+0

它如何减少实际上的数据库加载?通过内存缓存? – 2012-02-27 08:03:44

-1

确实很难估计查询限制。这与您的应用程序的概念/设计有关。

如果您不必重新加载整个页面,我建议您考虑使用javascript(或rjs)以仅更新所需的数据。这应该也是一个UI改进,你的用户会喜欢它!

检查从您的ActiveRecord查询生成的SQL。确保一切都如预期。

考虑为了提高性能而对数据库进行非规范化处理。 (要小心)

这就是我从“代码端”看到的。

10

一个常见的做法是明智地使用include =>:association选项。

例如一个控制器上,你可以做:

def show 
    @items = Item.find(:all) 
end 

...和放映视图会做这样的事情:

<% @items.each |item| %> 
    <%= item.product.title %> 
<% end %> 

这将为每次调用产品的查询。但是,如果你申报的关联包括以下几个方面,你急切地加载协会在一个查询:

def show 
    @items = Item.find(:all, :include => :product) 
end 

与往常一样,请检查您的控制台查询的时间及。

0

我正在使用:连接和:选择选项,如果你只需要显示数据。 我发现非常有用的named_scope来定义所有可能的:连接和一个:select_columns named_scope。例如

class Activity < ActiveRecord::Base 
     belongs_to :event 
     belongs_to :html_template 
     has_many :participants 

     named_scope :join_event, :joins => :event 
     named_scope :join_owner, :joins => {:event => :owner} 
     named_scope :left_join_html_template, 
     :joins => "LEFT JOIN html_templates ON html_templates.id = activities.html_template_id" 
     named_scope :select_columns, lambda { |columns| {:select => columns}} 
     named_scope :order, lambda{ |order| {:order => order}} 
end 

所以现在你可以伊斯利建立查询是这样的:

columns = "activities.*,events.title,events.owner_id,owners.full_name as owner_name" 
@activities = Activity.join_event.join_owner.order("date_from ASC").select_columns(columns) 

我认为这是不是最好的,最安全的方式,但对我来说这真的缩小查询计数每个请求执行和对于一些错误的生成查询还没有提出任何错误。