2012-05-30 29 views
3

我有一個非常大的表(超過10M甚至100M的記錄)使用此模式:在一個大表中選擇每組隨機排

ID INT主鍵,排除INT

,並希望爲每個規則選擇一個隨機條目。我想這個查詢,但是這需要很長的時間(樹節點是表的名稱):保持數據

SELECT tmp.id,tmp.rule FROM treenode 
LEFT JOIN (SELECT * FROM treenode ORDER BY RAND()) tmp ON (treenode.rule = tmp.rule) 
GROUP BY tmp.rule; 

在內存中的哈希表需要大量的內存。 另一種選擇是從數據庫中提取每個組並選擇一個隨機條目。同樣,由於組數大約爲100k,因此將這些查詢數量發送到數據庫需要很長時間。

更新: 我可以補充說,這個表只填充一次,它不會有任何改變。身份證和規則在他們中有洞。

+0

根據您的數據的具體情況,各種優化都是可能的。閱讀它:http://jan.kneschke.de/projects/mysql/order-by-rand/ – goat

+0

這是更多關於從表中隨機輸入不是每組 –

回答

0

我發現通過所有條目花費的時間少於此查詢。所以我添加了一個列作爲規則* max(id)+ id並創建了一個索引(我應該使用視圖嗎?)。

我運行下面的查詢:

SELECT id,rule,temp FROM treenode where temp>? ORDER BY temp LIMIT 0,100000; 

在客戶端通過所有返回的條目,並填充緩衝。每當規則改變時,我從緩衝區中選擇一個隨機項並清除它(put index = 0)。然後我再次運行查詢?作爲最後返回的溫度值的值。

2

也許我錯過了一些東西,但不低於與您的查詢相當的查詢?

SELECT * FROM (SELECT * FROM treenode ORDER BY RAND()) x GROUP BY x.rule; 

因爲沒有加入,所以速度會更快。

+0

是的,這是更快,謝謝。但是在一張大桌子上仍然需要時間 –

相關問題