更新開始優化紅寶石查詢
這個問題是與再現的形式對每一個項目,而不是與SQL查詢。爲了優化我將根據需要添加表單與JavaScript。
好像我沒看過miniprofiler日誌正確的。我道歉,但留下可能有類似問題的其他人的問題。
更新結束
我使用miniprofiler找到我的應用程序的瓶頸。我找到了一個!
SELECT "projects".* FROM "projects" INNER JOIN "memberships" ON
"projects"."id" = "memberships"."project_id" WHERE
"memberships"."user_id" = 1 AND (active = 't')
1059.50 ms
Rendering: projects/_index — 1023.18 ms
它在1秒內發現了185個項目。
我怎樣才能進行查詢,這是否更有效?
我有這個在我的projects_controller指數
@projects = current_user.projects.is_active
在項目模型IS_ACTIVE範圍
scope :is_active, where(["active = ?", true])
的項目和用戶有一個多對多的關係,有一個會員連接表
的會員制模式
class Membership < ActiveRecord::Base
attr_accessible :project_id,:user_id,:created_at,:updated_at
belongs_to :user
belongs_to :project
end
成員表
def self.up
create_table :memberships do |t|
t.integer :project_id
t.integer :user_id
t.timestamps
end
add_index :memberships, [:project_id, :user_id], :unique => true
end
我在生產環境中的本地計算機在PostgreSQL作爲數據庫
添加由吉里·波斯皮西爾要求解釋運行此。在控制檯中,它看起來並不慢。這個解釋是在開發中完成的。有同樣的問題還有
User.first.projects.is_active.explain
User Load (0.3ms) SELECT "users".* FROM "users" LIMIT 1
Project Load (2.3ms) SELECT "projects".* FROM "projects" INNER JOIN "memberships" ON "projects"."id" = "memberships"."project_id" WHERE "memberships"."user_id" = 1 AND (active = 't')
EXPLAIN (0.2ms) EXPLAIN QUERY PLAN SELECT "projects".* FROM "projects" INNER JOIN "memberships" ON "projects"."id" = "memberships"."project_id" WHERE "memberships"."user_id" = 1 AND (active = 't')
=> "EXPLAIN for: SELECT \"projects\".* FROM \"projects\" INNER JOIN \"memberships\" ON \"projects\".\"id\" = \"memberships\".\"project_id\" WHERE \"memberships\".\"user_id\" = 1 AND (active = 't')\n0|0|1|SEARCH TABLE memberships USING INDEX index_memberships_on_user_id (user_id=?) (~10 rows)\n0|1|0|SEARCH TABLE projects USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)\n"
視圖
<% @projects.each do |project| %>
<li class="tab_list" id="project_<%= project.id.to_s %>">
<div class="tab_list_text"><%= link_to project.name, project_path(project) %></div>
<span class='open_project_update button edit' id="project_update" data-id="<%= project.id %>" data-object="project" title="Edit project">Edit</span>
<div class="dialog_form" id="project_update_<%= project.id %>_form" title="Update project" style="display:none;">
<%= form_for(project) do |f| %>
<ul>
<li><%= f.label :name %><%= f.text_field :name %></li>
<li><%= f.label :description %><%= f.text_field :description %></li>
<li><%= f.label :due %><%= f.text_field :due, :value => project.due.strftime("%Y-%m-%d"), :id => "date_project_#{project.id}" %></li>
<li><%= f.label :customer_id %><%= f.select(:customer_id, @customers.map {|customer| [customer.name, customer.id]}, {:include_blank => 'None'})%></li>
<li><%= f.submit 'Save', :class => 'submit' %></li></ul>
<% end %>
</div>
<a class="activate_project button" data-object="project" data-id="<%= project.id.to_s %>">Archive</a>
</li>
<% end %>
你能解釋一下運行查詢嗎? –
我已經用解釋 –
更新了這個問題。項目負載只需要2.3ms。呈現項目/ _index的時間是1秒。查詢不是你的瓶頸。或者,也許我錯了......我整晚都在睡覺。 –