【问题标题】: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 结果。

      【讨论】:

      • 谢谢 Mladen,我会检查解释
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多