2010-09-02 135 views
1

我一直在使用rand()的順序,它變得太多了瓶頸。最快的方式從數據庫中獲得隨機記錄

我已經試過這

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

而且它會工作,如果所有的ID進行遞增,但與此特定的表,他們不是。這些ID本身是相當隨機的。

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

+0

可能重複[如何在SQL中請求隨機行?](http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql) – 2010-09-02 07:58:53

回答

1

也許創建另一個表,並把那裏所有的ID以緊湊的方式,將ID INT自動增量?如果你經常使用這個函數,新表將爲自己付出代價。

+0

這實際上不是一個壞主意,所以然後我可以使用我發佈的改進查詢,但可以根據自動增量列進行 - 好主意!將嘗試。 – dzm 2010-09-02 19:54:21

+0

像魅力一樣工作 - 謝謝! – dzm 2010-09-02 20:53:40

+0

不要忘記添加觸發器來更新原始表更新時的緊湊表。 – alxx 2010-09-03 06:27:39

-1

你可以使用這個(它也有一些缺點)

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

Mysql reference

+1

是不是這正是Dave爲了性能原因試圖避免的? – 2010-09-02 07:57:24

+0

也看這個帖子 http://stackoverflow.com/questions/2663710/how-does-mysqls-order-by-rand-work – Tim 2010-09-02 07:57:40

+0

是的,我現在看到,愚蠢的我 – Tim 2010-09-02 07:59:34

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})

1

Raveren:應該快了......

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

$limit = 3; 
shuffle($ids); 

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

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

你是對的! +1 – raveren 2011-04-08 11:21:06

相關問題