我一直在使用rand()的順序,它變得太多了瓶頸。最快的方式從數據庫中獲得隨機記錄
我已經試過這
SELECT id
FROM users
JOIN (
SELECT CEIL(RAND() * (SELECT MAX(id) FROM users)) AS id
) AS r2
USING (id)
而且它會工作,如果所有的ID進行遞增,但與此特定的表,他們不是。這些ID本身是相當隨機的。
任何人都有更好的方法?謝謝!
我一直在使用rand()的順序,它變得太多了瓶頸。最快的方式從數據庫中獲得隨機記錄
我已經試過這
SELECT id
FROM users
JOIN (
SELECT CEIL(RAND() * (SELECT MAX(id) FROM users)) AS id
) AS r2
USING (id)
而且它會工作,如果所有的ID進行遞增,但與此特定的表,他們不是。這些ID本身是相當隨機的。
任何人都有更好的方法?謝謝!
好吧,如果你有很多行rand()的順序是強烈不推薦的,因爲每一行都需要在計算結果集之前計算出隨機數。
也許看看這個 - >http://www.electrictoolbox.com/msyql-alternative-order-by-rand/
這是代碼,我用在我們的應用程序相當性能關鍵的地方,它的基準執行方式的速度比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})
Raveren:應該快了......
$ids = mysql::getSingleColumn('query');
$limit = 3;
shuffle($ids);
for($i=0;$<$limit;$i++)
$usedIds[] = $ids[$i];
$idClause = implode(',',$usedIds);
你是對的! +1 – raveren 2011-04-08 11:21:06
可能重複[如何在SQL中請求隨機行?](http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql) – 2010-09-02 07:58:53