【发布时间】:2013-03-23 21:12:30
【问题描述】:
我有一个只有几行的表(前 50 行),我需要从表中获取随机值,我可以通过 ORDER BY RAND() LIMIT 1
做到这一点
主要问题是当我在 5 秒内有 6k 次选择时,rand stil 是否“可靠”?
rand 是如何计算的,我可以随着时间的推移播种吗? (idk,每 5 秒一次)。
【问题讨论】:
-
ORDER BY RAND最大的问题不是随机性(虽然是的,这是个问题),但事实上它会通过强制数据库扫描整个表并丢弃来杀死你的数据库性能它的所有索引。 -
即使只有 50 行?我认为这没什么大不了的(是吗?)。
-
不,如果您只是在谈论 50 行,那没什么大不了的。但同样,如果它只有 50 行,您可以轻松地将 mySQL 的
RAND从等式中完全删除,方法是将全部加载到一个数组中并在 PHP 代码中对其进行排序。我接受 PHP 的随机也会有同样的问题,但你可以将 mySQL 的ORDER BY RAND与 PHP 的array_rand()结合起来,并使用两种不同的随机算法对其进行双重洗牌。这应该会给你更多的熵。 -
直接在mysql中整理不是更好吗? (选择的随机化),我喜欢双重洗牌的想法,我正在考虑它,但我仍然没有用完随机值的风险吗? :) 那速度呢? mysql rand -> php rand 肯定比 mysql - rand 慢
-
是的,最好保存在mysql中。 PHP 选项只是真正发挥作用,因为它在表中的记录数量如此之少。如果您事先知道记录数,则另一个可行的选择是使用 PHP 随机化
LIMIT子句,因为它是一个小表。但我想真正的答案取决于你得到一个真正随机(即不可预测的)结果的问题有多大:ORDER BY RAND可能是完全明智的。它不是真正的随机,但如果你有多个人提出独立的请求,那么一个用户就很难独立预测。