2011-04-17 52 views
2

我得到了300 000行的表格。在此表中有專門的專用字段(稱爲order_number)來記錄該號碼,該號碼稍後用於顯示由order_number字段排序的此表中的數據。爲每個記錄分配隨機數/散列以便選擇按此數字排序的記錄,最好和簡單的方法是什麼?表格中的行數不穩定,可能會增長到1 000 000,因此rand方法應該將其記入帳戶。在表格中有隨機順序的元素的最佳方法

+0

所以你只需要一個隨機場?爲什麼不使用md5(rand(0,9999999))? – Ben 2011-04-17 00:08:36

+0

它會比sha2(id)更多嗎? – Newbie1 2011-04-17 00:24:02

+0

將不會sha2(id)給你相同的哈希,並且id會自動增加,所以不是真正的隨機 – Ben 2011-04-17 00:39:27

回答

1

Look at this tutorial從表中選擇隨機行。

+0

只要鏈接到教程並不是一個好的答案,即使教程的內容導致正確的方式解決問題。請添加本教程的精華的簡短摘要。 – weltraumpirat 2011-04-17 00:42:43

1

如果你不想使用MySQL的內置RAND()功能,你可以使用這樣的事情:

select max(id) from table; 
$random_number = ... 
select * from table where id > $random_number; 

這應該是快了很多。

1
UPDATE table SET order_number = sha2(id) 

UPDATE table SET order_number = RAND(id) 

SHA2()比RAND更隨機的()。

+0

請問您爲什麼推薦sha2而不是sha1? sha2會更好地隨機化嗎? – Newbie1 2011-04-18 15:59:05

+0

不,只是SHA1不再安全,所以它不應該在你的代碼中找到,所以代碼審計不會標記'OMG sha1被調用,'alarm''。儘管在這個例子中並不重要。 SHA1在這裏工作得很好。 – Johan 2011-04-18 18:33:05

0

我知道你有足夠的答案,但我會告訴你我們是如何在我們公司做到的。

我們使用的第一種方法是用於存儲爲每個記錄/行生成的隨機數的附加列。我們在此專欄上有INDEX,允許我們通過它訂購記錄。

id, name , ordering 
1 , zlovic , 14 
2 , silvas , 8 
3 , jouzel , 59 

SELECT * FROM table ORDER BY ordering ASC/DESC 

POS:你有指數和排序是非常快的 缺點:你將依賴於新的紀錄保持的

第二條本辦法我們已經使用記錄的隨機化就是卡爾·魯斯發表了他的答案。我們檢索數據庫中的記錄數量,並使用>(更大)和一些數學來檢索隨機化的行。我們正在使用二進制ID,因此我們需要保留自動增量列以避免InnoDB中的隨機寫入,有時我們執行兩個或更多個查詢來檢索所有數據,並保持足夠的隨機性。 (如果您需要從1,000,000條記錄中選擇30條隨機項目,則可以針對具有不同偏移量的10個項目分別運行3個簡單的SELECT

希望這對您有所幫助。 :)

相關問題