我正在處理我的第一個大型Rails應用程序,並且對某些事情有點困惑。Rails 3 - 在「數據庫級別」執行更多操作
我知道在數據庫級別做更多的工作會提高性能。但是我很困惑在數據庫級別運行的是哪種類型的命令。
例如:
@tasks = @project.tasks
<%= render partial: 'task', collection: @tasks %>
那是工作在數據庫級別?
謝謝,我知道這是一個非常新手的問題!
我正在處理我的第一個大型Rails應用程序,並且對某些事情有點困惑。Rails 3 - 在「數據庫級別」執行更多操作
我知道在數據庫級別做更多的工作會提高性能。但是我很困惑在數據庫級別運行的是哪種類型的命令。
例如:
@tasks = @project.tasks
<%= render partial: 'task', collection: @tasks %>
那是工作在數據庫級別?
謝謝,我知道這是一個非常新手的問題!
'在數據庫級別做更多工作會提高性能'
是的。非常基本的東西的軌道即
@thing = Thing.find(ID)
是非常有效的,你不應該在這些情況下,性能關心自己,
但是,關於過濾器是什麼某種類型的。
說你想要實現的功能,使您搜索包含特定的字符集的名稱,(這是一個人爲的例子,只是爲了說明)
你可以這樣做:
@things = Thing.all
@foothings = []
@things.each do |thing|
if /foo/ =~ thing.name
@foothings << thing
end
end
或者你可以這樣做:
class Thing < ActiveRecord::Base
def self.filtered(what)
self.where("name like ?","%#{what}%")
end
end
@foothings = Thing.filtered("foo")
數據庫將執行搜索更快(第二個例子)。它是高度調優和優化的C代碼(可能),其中RoR仍然是一種解釋型語言。另外,在第一個例子中,所有東西都是從數據庫中請求的,如果RoR機器和數據庫機器之間存在網絡延遲,那麼只會返回名稱中帶'foo'的東西,這也會影響性能。
假設@project
是一個與任務類的關係的ActiveRecord對象,然後對數據庫執行提取以填充@tasks
對象。
當您運行rails server時,請觀察控制檯的輸出。它會向您顯示何時對數據庫執行SQL查詢。這將幫助您瞭解代碼執行過程。與Rails玩得開心!
除非您實際編寫要使用的數據庫,否則數據庫級別實際上並不是您的代碼的一部分。良好的程序設計與數據庫接口,就像你給mysql一個查詢並且爲你查詢一個數據庫並返回你在代碼中使用的結果。所以數據庫級別是mysql自己查詢結果,這是你完成大部分工作的地方,因爲它已經被高度優化了。性能來的地方是傾銷大部分工作,例如,你可以制定一個查詢,如:「SELECT * from mytable」,然後你將得到一大堆的元素,如果這就是你想要的,那麼很棒,但如果你想要從這個集合中選擇一個特定的項目,你必須在整個集合上使用一些查找算法(可能必須掃描它們的全部或其他內容,它的性能很差),或者你可以更具體地查詢數據庫(SELECT * from mytable WHERE x等等),並返回一小組準備使用的結果,那99%的時間會給你更好的表現。
謝謝!正是我期待的區別。 – nathan 2013-02-20 18:24:05