Rails以哪种顺序进行数据库查询

时间:2010-01-31 08:49:18

标签: sql ruby-on-rails ruby

Select n objects randomly with condition in Rails Anurag慷慨提出这个答案随机选择n个帖子,投票数量为> = x

Post.all(:conditions => ["votes >= ?", x], :order => "rand()", :limit => n)

我担心的是,拥有超过x票数的帖子数量非常大。

数据库将此条件应用于查询的顺序是什么?

是吗

  • (a)选择n个投票的帖子> x然后随机化吗?或
  • (b)选择所有投票的帖子> x然后随机,然后选择n个第一个帖子?
  • (c)其他?

3 个答案:

答案 0 :(得分:3)

检查开发日志的建议非常有用。

然而,在这种情况下,随机化发生在MySQL端,而不是在Active Record中。为了查看如何在MySQL中运行查询,您可以从日志中复制查询并将其粘贴到您选择的MySQL工具(控制台,GUI,无论如何)中,并在其前面添加“EXPLAIN”。

你应该得到类似的东西:

EXPLAIN SELECT * FROM posts WHERE votes >= 'x' ORDER BY rand() LIMIT n 

当我在MySQL中尝试类似的查询时,我被告知:

Select Type: SIMPLE
Using where; Using temporary; Using filesort

然后你应该搜索关于如何优化MySQL查询的一些关于SO的优秀建议。如果存在问题,则在投票列上添加索引可以提高性能。情况。

答案 1 :(得分:1)

正如Toby已经指出的那样,这完全取决于SQL服务器,一切都在查询本身中完成。

但是,我担心你不能获得真正的随机输出,除非数据库首先获得整个结果集,然后将其随机化。虽然,你应该检查EXPLAIN结果。

答案 2 :(得分:0)

development.log中查找生成的查询,应该给你一个线索。