[英]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.