2013-06-04 46 views
5

我记得在某处读取使用rand()命令的顺序很糟糕,我只是对它进行了初始化并找到了证明它的文章。对于大型数据库,rand()的顺序可能非常慢,建议的解决方案是在php中生成一个随机数并根据它进行选择。问题是我需要验证其他字段才能返回我的记录。我可能还会删除一些旧记录,这也可能会导致问题。任何人都可以提供一个体面的方式从表中选择一些符合特定条件的随机记录(例如,字段paid必须等于1)?返回随机结果(按rand()排序)

+0

如果您使用php,请使用'shuffle'功能。 所以得到你的结果,然后在你的程序中洗牌。 –

+0

但是如果我返回了100,000个结果,我不想获取所有的结果 –

+0

@FabianBigler将大量结果拉到php中以获得仅仅几个可能比'rand by rand()limit N'。 – Kevin

回答

2

你需要它们的随机程度如何?如果你不需要一个超级均匀分布试试这个

select min(pk_id) from my_table where pk_id > %(random_number)s and paid=1 

其中%(random_number)s是含有0随机数max(pk_id)-1绑定变量在每次运行查询

+0

这是一个不错的主意,但我无法承担多次显示相同结果集的风险。这只会告诉人们我有一个糟糕的随机系统。 + rep –

+0

@php_nub_qq每次执行查询时,如果您生成一个新的随机数,它将会是不同的记录 – cmd

+0

是的我知道但我需要返回2到8个记录,我将其称为一个集合,并且如果随机数应该是max(pk_id)-8(我将它设置为最大随机数),那么将始终显示pk_id-7和pk_id-6。如果8是我需要返回的最后8个记录总是连续的。我不想运行8个单独的查询 –

7

,通过RAND()排序可以之所以时间再生慢是因为在返回任何东西之前,你迫使数据库实际排序整个表。减少单个表扫描的负载要快得多(尽管仍然有点慢)。

这意味着,你可以只通过避免排序得到一部分的方式:

SELECT * 
    FROM my_table 
    WHERE RAND() < 0.1 
ORDER BY RAND() 
    LIMIT 100 

这将选择表中的所有行的1%左右,对它们进行排序,并返回前100只是请注意,这里的主要问题(以及@ cmd的答案)是您无法确定查询是否返回任何内容。

上面的方法应该包括一个完整的表扫描(决定使用哪个行),后面跟一行大约1%的行。如果您有很多行,则可以相应地减少百分比。

+0

我需要确定我会返回一些内容,并且我需要确保返回的记录完全是随机的。如果没有更好的选择,我会使用@cmd的建议并运行一些查询。 –

+0

但@ cmd的建议有同样的弱点 - 你不能确定它会返回任何东西。 – mzedeler

+0

为什么不呢?我不明白它可能不会返回任何东西。 –