2009-12-12 36 views
0

我一直在閱讀很多關於使用「rand by order」的缺點,所以我不需要更新。 我在想,因爲我只需要從數據庫中檢索到的行數量有限被隨機,也許我應該做的:PHP,MySQL - 結果數組shuffle會比「select ... order by rand()」更快嗎?

$r = $db->query("select * from table limit 500"); 
for($i;$i<500;$i++) 
$arr[$i]=mysqli_fetch_assoc($r); 
shuffle($arr); 

(我知道這只是隨機化500個第一行,是吧)。

會是這樣快於

$r = $db->("select * from table order by rand() limit 500"); 

讓我提,說數據庫表上擠滿了超過... 10,000行。

你爲什麼不自己動手?!? - 好吧,我有,但我正在尋找你的經驗意見。

謝謝!

+1

你想隨機排列前500行的順序,還是返回500個隨機行?這是一個重要的區別,您的兩個解決方案會產生不同的結果! – Artelius

+0

我明白你在說什麼,但無論哪種方式對我都很好。我只是尋找最快的方法。 – Gal

+0

最快的方法是檢索500行*然後*洗牌它們。我相信可以在SQL中執行此操作(這很可能比PHP解決方案更快),但它需要與您建議的查詢不同的查詢。 – Artelius

回答

1

500或10K,樣品大小太小而能夠得出結論有形。在100K時,你仍然在看1/2 second region on this graph。如果您仍然關注性能,請查看two options for a randomized number I provided in this answer

我們沒有您的數據或設置,所以留給您來實際測試情況。有很多關於如何在PHP中計算流逝時間的頁面 - 創建兩個頁面,一個使用shuffle,另一個使用RAND()查詢。每跑至少10次,&看一看。

+0

謝謝,在發佈這個問題之前,我已經多次閱讀過這個帖子。 – Gal

1

我正在用MySQL的經驗來看這個。

講起了第一段代碼:

$r = $db->query("select * from table"); 
for($i=0;$i<500;$i++){ 
    $arr[$i] = mysqli_fetch_assoc($r); 
} 
shuffle($arr); 

顯然,這將是更有效地限制所選行中的SQL語句的數量,而不是做它的PHP。

這樣:

$r = $db->query("SELECT * FROM table LIMIT 500"); 
while($arr[] = mysqli_fetch_assoc($r)){} 
shuffle($arr); 

SQL操作會比這樣做在PHP中,尤其是當你有這樣的大量行得更快。找出一個好方法是做基準測試,找出哪一個更快。我敢打賭,SQL會比在PHP中洗牌更快。

所以,我的投票去了:

$r = $db->query("SELECT * FROM table ORDER BY RAND() LIMIT 500"); 
while($arr[] = mysqli_fetch_assoc($r)){} 
+1

RAND()是不可縮放的。一旦你碰到了成千上萬的行,它會顯着減慢。 –

+0

謝謝!我看到你提到的錯誤並加以糾正。 – Gal

+1

但是在shuffle和RAND之間(),RAND()肯定比shuffle更好.. – mauris