簡體   English   中英

Rails數據庫性能調優

[英]Rails database performance tuning

目前,我正在使用非常大的mysql2數據庫進行很多工作,盡管我已經索引了我認為適當的字段,但是某些查詢的返回時間非常慢。

我有兩個引起問題的模型CommentCommenter

現在,有一個has_many關系CommenterComment ,但我的查詢依賴於尋找每個評論的評論者的用戶名。 因此,我將運行以下內容:

c = Blog.first.comments ##this bit runs fine, I indexed the "blog_id" field on Comments
c.collect {|c| c.commenter.username}

為了解決速度問題,我在Commenter模型的commenter_id字段上創建了一個索引。 但是它仍然運行非常緩慢。

有人知道我可以做些什么,那將有助於提高查詢速度嗎?

在索引commenter_id幫助,當你想找到一個給定的評論commenter_id (“找到我提出的所有意見喬”)。

但是,當您使用c.commenter您正在搜索用戶,大概是其id等於評論的commenter_id id列上應該已經有一個索引。 surefire的方法是采用實際生成的sql語句(在開發中,這些語句在development.log中),並在其上使用解釋(例如)

explain select * from comments where id = 12345

鑒於您很難創建一個表而不在其id列上建立索引,因此最有可能的罪魁禍首是急於加載-如果某條帖子包含500條評論,則以上代碼將逐個獲取關聯的用戶,而那500條往返數據庫的總和

c.includes(:commenter).collect {...}

要么

c.eager_load(:commenter).collect {...}

將解決此問題(以上代碼段假定您正在使用導軌3)。

Collect將為每個帶有所有字段的評論者一次加載ActiveRecord對象。 包含/急於加載將使用一個查詢來加載它們,這將有助於提高速度,但是如果您想要絕對最佳的性能,並且只需要名稱,那么最好通過以下方式更直接地接觸到SQL:

c         = Blog.first.comments
user_ids  = c.collect(&:commenter_id)
usernames = Commenter.where(['commenter_id IN (?)',user_ids]).select('username').collect(&:username)

首先,您在這里做了太多不必要的查詢c.collect {|c| c.commenter.username} c.collect {|c| c.commenter.username}我認為熱切的加載可以為您提供幫助。 觀看此http://railscasts.com/episodes/23-counter-cache-column?autoplay=true

我使用熱切的負載算出了它,這不是RaskolnikOFF發布的鏈接,而是之前的rails-cast, http: //railscasts.com/episodes/22-eager-loading(仍然為您提供了推動我前往回答)

顯然我正在尋找以下內容:

b = Blog.find(:first, :include=>{:comments => :commenter})
b.comments.collect {|c| c.commenter.username}

第一行加載第一個博客及其所有關系(並返回博客)。 因此,當我撥打第二行時,所有內容均已加載並等待訪問。

哪種方法比我最初做的更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM