Rails:更快速地检索N个随机记录

时间:2014-06-07 15:02:34

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

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

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

1 个答案:

答案 0 :(得分: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

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