0

我的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。

谢谢。

4

2 回答 2

1

如果您使用的是 rails 4,那么查询链接是可能的。否则你可以做的是选择你需要显示的必填字段。并对搜索字段进行正确的索引,但请确保在添加索引之前和之后请检查您的性能。或另一种选择是编写所需的 sql 查询。并通过find_by_sqlrails中的方法使用它。

于 2013-09-14T09:42:24.963 回答
0

两个单独的查询,恕我直言,将明显更快,因为它们每个都更简单,更容易数据库优化。

因此,理想情况下,人们想要的是union这两个查询中的一个。不幸的是,afaik,ActiveRecord/Arel/Squeel 中不存在此功能。所以你必须编写自己的查询来解决这个问题。

当然:我不确定如果你执行两个查询,联合,然后区分,你将不会获得与第一个查询相同的执行速度。

我通常使用 postgresql(并且会推荐),但我注意到 MySQL 也支持FULLTEXT索引,所以你可能想研究一下。

于 2014-05-08T07:13:54.933 回答