我的活动记录查询导致加载时间缓慢

时间:2014-05-01 18:27:21

标签: ruby-on-rails activerecord

我的应用程序上有一个侧边栏,我用“开放”门票列出客户。当有很多客户打开门票时,我的网站运行速度很慢。在检查日志时,似乎滞后来自侧边栏。这是查询:

@sidebar_customers = current_user.company.customers.open_or_claimed.where("user_id = ? OR user_id IS NULL", current_user.id).order(aasm_state: :asc)

这就是我显示侧边栏的方式:

  - @sidebar_customers.each do |customer|
    %li#sidebar-customer{:class => "#{active_state_class(customer)}"}
      = link_to raw("<i class = 'menu-icon fa #{claimed_class(customer)}' id = 'icon-cust-#{customer.id}'></i><span class = 'mm-text'>#{customer.full_name}</span>#{'<span id = "open" class = "label label-success pull-right">open</span>' if customer.open?}#{"<span id = 'new-cust-#{customer.id}' class = 'label label-danger'>new</span>" if customer.not_viewed_count > 0 && customer.claimed?}"), customer, id: "cust-#{customer.id}"

我怎样才能让它更快?我做错了什么?

编辑:此外,这似乎也使网站变得缓慢:

@messages = current_user.company.messages.find(:all, :order => "id desc", :limit => 25)

1 个答案:

答案 0 :(得分:0)

这并不奇怪,因为current_user.company.customers SQL连接在users表,companys表和customers表上。 SQL连接很昂贵(耗时)。正如您所注意到的,连接的性能随着数据的增加而显着降低(在这种情况下是客户)。

这里有很多方法可以优化性能。

首先尝试加载数据。请参阅渴望加载多个关联部分 http://guides.rubyonrails.org/active_record_querying.html

接下来回顾一下关于include和Joins性能差异的SO线程。 Rails :include vs. :joins

请务必在实验时查看日志文件中生成的SQL。看看你是否可以消除任何不必要的加入。

加速查询的其他常见事项:向表中添加索引。通过添加更多约束(在条件中)减少返回的数据。