2013-03-15 76 views
1

我有一個由連接組成的查詢,並且有大約30,000多條記錄的輸出。我想從這些記錄中得到10個隨機行而不使用SQL命令ORDER BY rand()。從查詢中獲取10行

我試着循環遍歷記錄,並把它們放在一個數組中,並隨機播放(獲得shuffle後的前10個),但它需要大約8-12秒才能生成。我想不惜一切代價減少這個處理時間。

我該如何做到這一點?

+0

你目前的查詢是什麼? – 2013-03-15 14:59:50

+0

爲什麼你不想使用rand()? – creinig 2013-03-15 15:00:16

+0

我不確定是否有可能從沒有使用rand的查詢中獲得隨機行。你在使用MySQL嗎? – chawkinsuf 2013-03-15 15:01:57

回答

8

好吧,如果你不希望使用RAND()做一個更快的選擇只是ID列的第一則僅選擇要

  1. 10行選擇ID添加到$ idarray
    SELECT id FROM table
  2. 洗牌和切$ idarray
    shuffle($idarray);
    $ids=array_slice($idarray,0,10);
  3. 選擇完整的行
    $sql="SELECT ... WHERE id IN (".implode(', ', $idarray).")";

編輯:這肯定比使用ORDER BY RAND()快得多!

+1

從數據庫中獲取30000+個ID(並且正在增長),對它們進行混洗然後扔掉其中的29990+肯定會比讓RDBMS進行隨機化要慢得多... – creinig 2013-03-15 15:08:16

+0

我剛剛測試過從一個數據庫和ORDER BY RAND()限制* 10只是id列*比沒有ORDER BY和LIMIT長30倍以上。 – Popnoodles 2013-03-15 15:11:33

+0

...使用ORDER BY和LIMIT選擇30列需要1000多倍的時間。 PHP需要0.003秒來洗牌並分割30,000個ID。 – Popnoodles 2013-03-15 15:28:53