最快的方式从DB获取随机记录

时间:2010-09-02 07:50:59

标签: database mysql

我一直在使用rand()的订单,而且它变得太过于瓶颈了。

我试过这个

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

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

任何人都有更好的方法吗?谢谢!

5 个答案:

答案 0 :(得分:1)

也许创建另一个表并以紧凑的方式放置所有id,添加id int autoincrement?如果您经常使用此功能,新表将为自己付费。

答案 1 :(得分:1)

拉夫伦:应该更快......

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

$limit = 3;
shuffle($ids);

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

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

答案 2 :(得分:0)

如果你有很多行按rand()排序,那么强烈建议不要这样,因为每行需要在结果集可以订购之前计算随机数。

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

答案 3 :(得分:0)

这是我在我们的应用程序中用于性能非常关键的代码,它的基准测试速度比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})

答案 4 :(得分:-1)

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

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

Mysql reference