我一直在使用rand()的订单,而且它变得太过于瓶颈了。
我试过这个
SELECT id
FROM users
JOIN (
SELECT CEIL( RAND( ) * ( SELECT MAX( id ) FROM users ) ) AS id
) AS r2
USING ( id )
如果所有的id都增加了它会起作用,但是对于这个特定的表,它们不是。 id是相当随机的。
任何人都有更好的方法吗?谢谢!
答案 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)