Rails以哪种顺序进行数据库查询
在Rails Anurag随机选择n个对象时,我们建议这个答案随机选择n个post,票数> = x
Post.all(:conditions => ["votes >= ?", x], :order => "rand()", :limit => n)
我担心的是,超过x票的post数量非常多。
数据库将此条件应用于查询的顺序是什么?
可以
- (a)选择n个投票> x的post,然后将其随机化? 要么
- (b)选择所有票数> x的post,然后随机选择n个post?
- (c)其他?
检查开发日志的建议非常有用。
但是,在这种情况下,随机化发生在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的优秀建议。 如果存在问题,则在投票列上添加索引可以提高性能。 情况。
正如Toby已经指出的那样,这纯粹取决于SQL服务器,一切都在查询本身中完成。
但是,我担心你不能获得真正随机化的输出,除非数据库首先获得整个结果集,然后将其随机化。 虽然,你应该检查EXPLAIN结果。
在development.log
查找生成的查询,应该给你一个线索。