【问题标题】:Rails: Faster way to retrieve N random recordsRails:检索 N 个随机记录的更快方法
【发布时间】:2014-07-28 17:02:32
【问题描述】:

如何retrieve one record quickly 或如何低效地检索多条记录(通过提取所有 ID)已被详细记录。我想知道从包含数百万条记录的表中检索 N 条记录的最快方法是什么。

我发现有一个 3M 行的 MariaDB 表,提取所有 ID 需要 10 多秒,而通过 rand() 排序需要一分钟以上。这让我认为 N 个单独的随机偏移调用(在找到总表数之后)可能会更快,假设 N 相对较低。我仍然想知道是否有更快的方法,或者如果没有,一些技巧可以在单个查询中进行随机偏移调用。

【问题讨论】:

  • 如果您只是拉随机记录,添加 where 子句是否有意义,以便从较小的时间范围内拉出所有“随机”记录,这样 rand 排序将针对较少的记录?说过去 2 周内创建的记录
  • @house9 在某些情况下,它可以。我正在考虑对任何东西进行采样的更通用的情况。
  • 执行 30 个查询,随机偏移量和限制为 1,比从 300 万行中选择每个 Id 来打乱它们并取前 30 个查询要快。
  • 我想是这样,但 30 次查询似乎也不是很有效,所以我想知道是否有更快的方法。

标签: sql ruby-on-rails performance random sample


【解决方案1】:

我最近碰巧在阅读和思考这个问题!我遇到的最佳解决方案是http://explainextended.com/2009/03/01/selecting-random-rows/ 给出的解决方案:创建一个随机函数,可以沿着页面中的查询行逐行迭代应用(对于 n=10):

SELECT  rnd_id, rnd_value
FROM    (
        SELECT  @cnt := COUNT(*) + 1,
                @lim := 10
        FROM    t_random_innodb
        ) vars
STRAIGHT_JOIN
        (
        SELECT  r.*,
                @lim := @lim - 1
        FROM    t_random_innodb r
        WHERE   (@cnt := @cnt - 1)
                AND RAND() < @lim / @cnt
        ) i

请注意,如果您有额外的 where 条件,则不能使用这种方法 - 事实上,我认为在这种情况下没有一种特别有效的方法可以解决它,同时可靠地获得所需数量的结果。

【讨论】:

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