簡體   English   中英

Rails ActiveRecord查詢:太慢了,除非我將其分為2個查詢。 為什么?

[英]Rails ActiveRecord Query: Too slow unless I split it into 2 queries. Why?

我的Post模型has_many :comments 它具有此查詢的搜索方法:

joins{comments.outer}.where{ (title.like_any search_words) | (body.like_any search_words) | (comments.body.like_any search_words) }

這樣就可以得到所需的記錄:“查找標題,正文或其任何評論的正文(如果有評論)與任何search_words匹配的所有帖子”。 問題是: 此查詢需要8秒鍾! 如果將其拆分為2個查詢,則可以使它在短短的毫秒內運行:

( where{ (title.like_any search_words) | (body.like_any search_words) }
 + joins{:comments}.where{ comments.body.like_any search_words } ).uniq

這給出了相同的結果,只是速度更快。 但是它將ActiveRecord::Relation強制放入一個數組中,因此之后我無法再執行.includes.pagination 我真的想將結果保留為ActiveRecord::Relation ,但我希望它更快。 你會怎么做?

PS:我在這里使用Squeel。

謝謝。

如果您使用的是Rails 4,則可以進行查詢鏈接。 否則,您可以根據需要選擇必填字段。 並為搜索字段進行正確的索引編制,但請確保在添加索引前后,請檢查您的效果。 或另一個選擇是編寫必需的sql查詢。 並在rails中通過find_by_sql方法使用它。

兩個單獨的查詢,恕我直言,將大大加快,因為它們每個都簡單得​​多,並且數據庫優化起來也容易得多。

因此,理想的是什么人想的是union這兩個查詢。 不幸的是,afaik,ActiveRecord / Arel / Squeel中不存在此功能。 因此,您必須編寫自己的查詢來解決該問題。

當然:我不確定如果同時執行兩個查詢,然后再進行聯合查詢,您將不會獲得與第一個查詢相同的執行速度。

我通常使用postgresql(並建議這樣做),但是我注意到MySQL也支持FULLTEXT索引 ,因此您可能需要研究一下。

暫無
暫無

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

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