我的应用程序上有一个侧边栏,我用“开放”门票列出客户。当有很多客户打开门票时,我的网站运行速度很慢。在检查日志时,似乎滞后来自侧边栏。这是查询:
@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)
答案 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。看看你是否可以消除任何不必要的加入。
加速查询的其他常见事项:向表中添加索引。通过添加更多约束(在条件中)减少返回的数据。