2010-07-08 106 views
1

我知道这是非常相似的this question,但我想增加我的具体情况,看看答案是否不同。如何从大表的子集中选择mysql中的n个随机行?

我读过,你可以简单地做ORDER BY RAND(),但这对大型表来说是一个坏主意。但是,我可以使用WHERE子句将我的行限制为最大约160。所以问题是,WHERE子句是否在ORDER BY RAND()之前进行了评估和处理,从而使这是一个可接受的解决方案?

我的场景是我正在实施纸牌游戏。我有一个甲板表和一个deck_card表。我试图从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中。

顺便说一句,我在轨道中这样做,我试图洗牌Array.sort_by { rand }的结果,但我看到的证据表明,轨道兰德并不完全随机。所以,另一个问题是,在SQL还是在rails中尝试随机函数会更好。目前,我没有SQL中的ORDER BY RAND或Limit。我在轨中洗牌结果数组,然后从混洗阵列中弹出n张牌。但是,我看到的结果表明,洗牌并不是真正的随机洗牌。

另一个问题/解决方案可能是表锁定。这是一款多人实时游戏应用。偶尔我会看到> 1个玩家绘制同一张牌。我认为这是来自玩家同时进行绘画并击中这个查询和随机播放,这些都会以某种方式返回重叠的结果。

回答

3

“所以问题是,WHERE子句是否在ORDER BY RAND()之前进行了评估和处理,从而使这是一个可接受的解决方案?”

是的。

按顺序只是一个游标,指示按照什么顺序从集合中检索数据。

0

我认为使用子查询将作为WHEREORDER BY

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 
处理