簡體   English   中英

如何從大表子集中選擇mysql中的n個隨機行?

[英]how to select n random rows in mysql from subset of large table?

我知道有這個問題 ,這是非常相似的,但我想補充我的具體情況,看看答案是不同的。

我讀過,您可以簡單地執行ORDER BY RAND(),但這對大型表來說是個壞主意。 但是,我可以使用WHERE子句將行限制為最多約160個。 所以問題是,在ORDER BY RAND()之前是否對WHERE子句進行了評估和處理,從而使其成為可接受的解決方案?

我的情況是我正在實施紙牌游戲。 我有一個卡座桌和一個卡座桌。 我試圖從deck_cards表中簡單地繪制n張隨機卡。 每個游戲都有一個單獨的套牌,因此當玩家抓取n張牌時,我知道它來自特定套牌,因此建議的查詢為

select id
from deck_cards
where deck_id = ? and draw_pile = true
order by rand()
limit 5

draw_pile列用於顯示聽起來的樣子,我會在draw_pile或discard_pile中跟蹤卡片的位置。

順便說一句,我正在用rails進行此操作,並嘗試使用Array.sort_by { rand }來改組結果,但是我看到有證據表明rails rand不是很隨機。 因此,另一個問題是,在SQL或rails中嘗試隨機函數是否更好。 當前,我在SQL中沒有ORDER BY RAND或Limit。 我將結果數組拖入軌道,然后從經過改組的數組中彈出n張卡片。 但是,我再次看到的結果表明改組並不是真正隨機進行的改組。

另一個問題/解決方案可能是表鎖定。 這是一個多人實時游戲應用程序。 有時我看到> 1個玩家在繪制同一張牌。 我假設這是來自玩家同時繪制並點擊此查詢和隨機播放的某種方式,它們以某種方式返回了重疊的結果。

“所以問題是,在ORDER BY RAND()之前是否對WHERE子句進行了評估和處理,從而使其成為可接受的解決方案?”

是。

order by只是一個游標,它指示應該從集合中檢索數據的順序。

我認為使用子查詢將在ORDER BY之前作為WHERE處理

select id
from deck_cards
where id in (select id
             from deck_cards
             where deck_id = ? and draw_pile = true
          )
order by rand()
limit 5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM