2011-08-23 48 views
2

我的表看起來像這樣如何查詢隨機記錄在一個MySQL表,而在優先系統保

ID | Priority 
--------------- 
#1 | 25 
#2 | 50 
#3 | 125 
#4 | 300 
#5 | 500 

每1000個查詢我想(平均)獲取ID#1 25倍,#2 50次,#3 125次等。

我的表格會有1000個,最終有100,000+個記錄,這樣可以縮放嗎?

這個查詢會經常運行,所以它需要在一個大表中運行得非常快。

我絕對願意重新考慮表結構,如果有更有效的方法 - 任何建議?

+0

可能重複的[MySQL:選擇隨機輸入,但重量對某些條目](http://stackoverflow.com/questions/2417621/mysql-select-random-entry -but-weight-toward-certain-entries) – cdhowie

+0

只是想檢查一下,#1000的相對權重是多少?如何計算權重? (也就是說,如果我插入第6行,我怎麼會知道如何設置它的權重?)P.S.,如果這是您在別處處理的事情,那也沒關係。 –

+0

權重將在別處計算。 – Raymond

回答

2

我想你會很難找到一個能夠在非常大的數據集上很好地擴展的查詢。

有有效兩條路,你可以去:

  1. 使用加權表像你這樣,然後乘以該加權通過對每行一個隨機數。
  2. 讓您的表中每個ID的記錄計數反映您的權重。例如#2的可能性是#1的兩倍,所以#1有1條記錄,#2有兩條記錄。如果#3的可能性是#2的四倍,那麼它將有八個記錄等。這種方法有一個主要的主要缺點 - 如果#4與#1的可能性相差一半,那麼唯一的解決方法是將數字加倍每個其他類型的記錄,然後爲#4插入一條記錄。非常,非常混亂,以跟蹤。

考慮到這一點,這裏的使用方法1解決方案:

SELECT ID 
FROM tablename 
ORDER BY (RAND() * Priority) DESC 
LIMIT 1; 

(我不是100%肯定的語法,因爲我是一個SQL Server/Oracle的頭,而不是到MySQL,但我認爲這是正確的。)