20

我一直在構建rails應用程序一段時間,但不幸的是,對於我來說,我的應用程序都沒有大量的數據或流量。但現在我有一個正在蒸蒸日上的。因此,我首先想到擴展和優化我的應用程序。Rails 3數據庫索引和其他優化

看起來第一個也是最簡單的一步就是使用數據庫索引。我有一個很好的索引列表,應該涵蓋幾乎所有的查詢,但是當我通過遷移將它們添加到我的數據庫時,只需要幾秒鐘就可以添加它們。出於某種原因,我認爲他們將不得不通過我的所有參賽作品(其中有成千上萬)併爲它們編制索引。

這是否表示我的索引還沒有應用於我現有的數據?他們只會被添加到新的條目?

此外,我期待到其他縮放解決方案,如memcached的,和周圍減磅我查詢等

如果任何人都可以點我一些很好的資源優化我的Rails應用程序3我將不勝欣賞它!

謝謝!

編輯:

感謝所有關於數據庫索引偉大的答案!我還應該考慮優化和縮放我的應用程序? Memcached的?在優化方面什麼具有最佳性能提升/努力比率?

回答

22

在一些場合,例如,在所有ID和數據上添加索引總是一個好主意。電子郵件地址。同樣,您可以安全地假設ID永遠不會變爲負數,因此使ID列Unsigned將從長遠來看受益。與任何DBA(數據庫管理員)交談,他們會多次告訴你這樣做。

目前你最有可能有這樣的所有你的ID列...

t.integer :column_name, :null => false 

或...

t.references :column_name, :null => false 

通過簡單地改變這...

t.column :column_name, 'integer unsigned', :null => false 

你會看到一個微小的增加。

指數的簡單...

add_index :reviews, [:column_id, :column_type] # Polymorphic 
add_index :reviews, :column_id # Standard 

Rails API應該給你所有你需要知道的。

Peepcode有一個真正的tutorial video這是一個偉大的洞察力,我非常值得的12美元和37分鐘的時間。有像MetaWhere這些寶石可能會幫助你。

最重要的是,在Rails 3及以上的版本中,ActiveRelations是ActiveRelations的一部分。這是隻在需要時執行查詢的地方。例如,關閉User.all,您可以調用User.scoped,並且View中的迭代發生在執行中的SQL時。強大的東西和Rails的未來。

讓我們知道你如何繼續...一切順利。

8

您寫道:

,但是當我通過遷移將它們添加到我的數據庫只用了幾秒鐘就可以添加。出於某種原因,我認爲他們將不得不通過我的所有參賽作品(其中有成千上萬)併爲它們編制索引。

索引不會花費很長時間,除非您擁有數百萬條記錄。數據庫索引只是一種排序,並記錄下來以後使用。

您的索引應用於新記錄和現有記錄。

UPDATE

爲您的降壓

最大的爆炸:

  1. 移動長時間運行的進程的delayed_job(或類似)
  2. 擺脫的n + 1查詢

Memcache的是不錯,但是會讓你的應用程序變得複雜,並且在你的應用程序被數據庫讀取綁定之前,你通常不會獲得提升。

+1

還檢出'sidekiq'一個相對較好的選擇(更高效等)到'delayed_jobs'並且不斷開發。 – Ameen 2013-10-09 08:24:56

+0

同意@Ameen --- sidekiq今天是最好的選擇,Resque秒。 (我原來的回答是2011年5月 - 事情自那時起就發生了變化) – 2013-10-09 17:32:38