2012-03-13 113 views
0

目前,我正在使用此查詢在我的PHP腳本:如何對所選行進行排序(真正)隨機?

SELECT * FROM `ebooks` WHERE `id`!=$ebook[id] ORDER BY RAND() LIMIT 125; 

該數據庫將約2500排在最高大的,但我讀過ORDER BY RAND()最終將處理時間慢下來作爲數據數據庫增長。

所以我正在尋找一種替代方法來查詢我的問題,讓事情順利進行。

此外,我注意到ORDER BY RAND()並不是真正的隨機化行,因爲我經常看到它遵循某種模式,有時會一遍又一遍地重複。

是否有任何方法可以真正隨機化行?

+3

'ORDER BY RAND()'減慢,不'RAND()'本身。 – hakre 2012-03-13 16:58:08

+2

AFAIK最好的方法是做隨機PHP端。例如,如果你的ID是一致的,你可以從MySQL獲得count(*),然後隨機選擇一些id。 – Robus 2012-03-13 16:58:31

+3

看看http://stackoverflow.com/questions/1823306/mysql-alternatives-to-order-by-rand – a1ex07 2012-03-13 16:59:17

回答

1

RAND()功能是一個僞隨機數生成器,如果你不使用不同的值初始化它會給你相同的數字序列,所以你應該做的是:

SELECT * FROM `ebooks` WHERE `id`!=$ebook[id] ORDER BY RAND(UNIX_TIMESTAMP()) LIMIT 125; 

將種子從當前時間的隨機數發生器,並會給你一個不同的數字序列。

RAND()會減慢SELECTORDER BY子句,因爲它必須每次都生成一個隨機數然後按它排序。我建議你將數據返回給調用程序,並使用array_rand之類的東西隨機化。

+2

但unix_timestamp的粒度爲1秒,所以你只會得到一個不同的序列,如果有>每次查詢運行1秒鐘。 – 2012-03-13 17:04:55

+1

這可能導致在查詢中提供其他一些經過強化編碼的值或堅持秒,這實際上會使查詢可緩存,這取決於使用領域。 – hakre 2012-03-13 17:07:16

+1

@MarcB我提供了一個簡單的方法來解決這個問題。您當然使用'gettimeofday'並計算自epoch以來的微秒數並使用它,但是如果您需要在一秒鐘內將多個隨機集返回到同一個會話中,我會在緩存數據集中執行此操作,而不是每次都調用查詢。 – Karlson 2012-03-13 17:11:21