我有一個由連接組成的查詢,並且有大約30,000多條記錄的輸出。我想從這些記錄中得到10個隨機行而不使用SQL命令ORDER BY rand()。從查詢中獲取10行
我試着循環遍歷記錄,並把它們放在一個數組中,並隨機播放(獲得shuffle後的前10個),但它需要大約8-12秒才能生成。我想不惜一切代價減少這個處理時間。
我該如何做到這一點?
我有一個由連接組成的查詢,並且有大約30,000多條記錄的輸出。我想從這些記錄中得到10個隨機行而不使用SQL命令ORDER BY rand()。從查詢中獲取10行
我試着循環遍歷記錄,並把它們放在一個數組中,並隨機播放(獲得shuffle後的前10個),但它需要大約8-12秒才能生成。我想不惜一切代價減少這個處理時間。
我該如何做到這一點?
好吧,如果你不希望使用RAND()做一個更快的選擇只是ID列的第一則僅選擇要
SELECT id FROM table
shuffle($idarray);
$ids=array_slice($idarray,0,10);
$sql="SELECT ... WHERE id IN (".implode(', ', $idarray).")";
編輯:這肯定比使用ORDER BY RAND()快得多!
從數據庫中獲取30000+個ID(並且正在增長),對它們進行混洗然後扔掉其中的29990+肯定會比讓RDBMS進行隨機化要慢得多... – creinig 2013-03-15 15:08:16
我剛剛測試過從一個數據庫和ORDER BY RAND()限制* 10只是id列*比沒有ORDER BY和LIMIT長30倍以上。 – Popnoodles 2013-03-15 15:11:33
...使用ORDER BY和LIMIT選擇30列需要1000多倍的時間。 PHP需要0.003秒來洗牌並分割30,000個ID。 – Popnoodles 2013-03-15 15:28:53
你目前的查詢是什麼? – 2013-03-15 14:59:50
爲什麼你不想使用rand()? – creinig 2013-03-15 15:00:16
我不確定是否有可能從沒有使用rand的查詢中獲得隨機行。你在使用MySQL嗎? – chawkinsuf 2013-03-15 15:01:57