2013-07-16 61 views
0

我想在查詢後有隨機化的行,但使用order by rand()只是用盡了120k +行的表。我發現了一個小的解決方案,它只輸出行數,但它像從隨機索引開始一樣運行,然後返回#行數。它非常快,但它只是在隨機索引後返回一些行。該代碼是這樣:mysql隨機化結果和優化

SELECT * 
FROM lieky AS r1 JOIN 
    (SELECT (RAND() * 
       (SELECT MAX(col_0) 
        FROM lieky)) AS id) 
    AS r2 
WHERE r1.col_0 >= r2.id 
ORDER BY r1.col_0 ASC 
LIMIT 100 

,我發現它在這裏:http://jan.kneschke.de/projects/mysql/order-by-rand/

有什麼能幫助我嗎?

我想獲得隨機數據分頁,所以當用戶查詢數據庫時,他將始終以隨機順序獲取行。 感謝您的幫助。

回答

1

應當指出的是,

(SELECT (RAND() * (SELECT MAX(col_0) FROM lieky)) AS id) 

可以返回MAX(col_0),那麼你就只能得到1行(因爲WHERE r1.col_0> = r2.id)

我覺得好解決方案應該是這樣的:

  • 添加兩列groupId int,seed int;加上指數indexName(的groupId,種子)
  • 每x秒(也許每小時,每天,..)運行腳本,會是重新計算這些列(見下文)
  • 當用戶打開你行列出第一次(或當你想重新分配項目)你保存任何隨機groupId到用戶的會話; groupId可以從0到(從lieky中選擇max(groupId))
  • 顯示你使用查詢的行如:(select * from lieky where groupId =%save groupId%order by Seed limit x,100) - 它應該是非常快

關於recalc腳本,它會比較慢(所以最好在晚上運行它)。
種子可以通過使用更新:

update lieky set Seed = rand()*1000000 

然後設置的GroupId = 0前N行,爲的GroupId以下N行= 1,...
N是最大行,可以顯示用戶( max_page)*(per_page_count)

+0

嗯,這也是一種可能性,但我寧願每次點擊後都做出來。謝謝 – kalafun