【问题标题】:In which order Rails does the DB queriesRails 以何种顺序执行数据库查询
【发布时间】:2010-01-31 08:49:17
【问题描述】:
在Select n objects randomly with condition in RailsAnurag 好心地提出这个答案来随机选择 n 个有票数的帖子 >= x
Post.all(:conditions => ["votes >= ?", x], :order => "rand()", :limit => n)
我担心的是投票数超过 x 的帖子数量非常多。
数据库将此条件应用于查询的顺序是什么?
有吗
- (a) 选择 n 个投票 > x 的帖子,然后随机化?或
- (b) 选择所有票数 > x 的帖子,然后随机化,然后选择前 n 个帖子?
- (c) 其他?
【问题讨论】:
标签:
sql
ruby-on-rails
ruby
【解决方案1】:
检查开发日志的建议非常有用。
但是,在这种情况下,随机化发生在 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 查询的优秀建议。如果出现问题,在投票列上添加索引可能会提高性能。情况。
【解决方案2】:
正如 Toby 已经指出的,这完全取决于 SQL 服务器,一切都在查询本身中完成。
但是,除非数据库首先获取整个结果集,然后将其随机化,否则恐怕无法获得真正的随机输出。不过,无论如何,您都应该检查 EXPLAIN 结果。
【解决方案3】:
在development.log 中查找生成的查询,应该会给你一个线索。