【问题标题】:Fastest way get random record from DB从数据库中获取随机记录的最快方法
【发布时间】:2011-04-07 04:31:19
【问题描述】:

我一直在使用 rand() 的顺序,但它已经成为一个瓶颈。

我试过了

SELECT id
FROM users
JOIN (
  SELECT CEIL( RAND( ) * ( SELECT MAX( id ) FROM users ) ) AS id
) AS r2
  USING ( id )

如果所有的 id 都增加了,它会起作用,但是对于这个特定的表,它们不是。 id 本身是相当随机的。

谁有更好的方法?谢谢!

【问题讨论】:

标签: database mysql


【解决方案1】:

渡鸦:应该更快...

$ids = mysql::getSingleColumn('query');

$limit = 3;
shuffle($ids);

for($i=0;$<$limit;$i++)
  $usedIds[] = $ids[$i];

$idClause = implode(',',$usedIds);

【讨论】:

    【解决方案2】:

    这是我在我们的应用程序中用于性能非常关键的地方的代码,它的基准测试速度比order by rand() 快:

    $ids = mysql::getSingleColumn("select id from table where simple_where_clause = 'value'");
    
    $limit = 3;
    
    for ($i = 0;$i<$limit;$i++) {
        $r = rand( 0, count( $ids ) );
        if (isset($ids[$r])) {
            $usedIds[] = $ids[$r];
            unset($ids[$r]);
        } else {
            $i--;
        }
    }
    $idClause = implode(',',$usedIds);
    

    然后我在主查询中使用 $idClause:[...] WHERE id in ({$idClause})

    【讨论】:

      【解决方案3】:

      如果你有很多行,强烈不推荐使用 rand() 排序,因为在对结果集进行排序之前,每一行都需要计算随机数。

      也许看看这个 -> http://www.electrictoolbox.com/msyql-alternative-order-by-rand/

      【讨论】:

        【解决方案4】:

        也许创建另一个表并将所有 id 以紧凑的方式放在那里,添加 id int autoincrement?如果你经常使用这个功能,新表会自己买单。

        【讨论】:

        • 这实际上不是一个坏主意,所以我可以使用我发布的改进查询,但要根据自动增量列进行 - 好主意!会试试的。
        • 工作就像一个魅力 - 谢谢!
        • 原表更新时不要忘记添加触发器来更新紧凑表。
        【解决方案5】:

        你可以用这个(它有一些缺点)

        SELECT id FROM users ORDER BY RAND() LIMIT 0,1
        

        Mysql reference

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-09
        • 2018-07-20
        • 2012-04-13
        • 2011-01-27
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多