MySQL RAND()可以多久使用一次?它使用/ dev/random吗?

Kys*_*lik 5 php mysql random

我有一个几行的表(上面50),我需要从表中得到随机值我可以做到这一点
ORDER BY RAND() LIMIT 1
主要问题是在5秒内我有6k选择是rand stil'可靠'吗?如何计算兰特,我可以随着时间推移播种吗?(idk,每5秒钟).

Bil*_*win 5

MySQL伪随机数生成器是完全确定的.文档说:

RAND()并不是一个完美的随机发生器.这是一种快速生成按需随机数的方法,可以在同一MySQL版本的平台之间移植.

它不能使用/ dev/random,因为MySQL设计用于各种操作系统,其中一些操作系统没有/ dev/random.

MySQL使用返回的整数在服务器启动时初始化默认种子time(0).如果您对源代码行感兴趣,那么它位于文件sql/mysqld.cc中的MySQL源代码中init_server_components().我认为它不会重新播种.

然后,随后的"随机"数字仅基于种子.参见源文件mysys_ssl/my_rnd.cc,函数my_rnd().


对于随机选择任务的性能和质量,随机选择任务的最佳实践解决方案是在最小主键值和最大主键值之间生成随机值.然后使用该随机值选择表中的主键:

SELECT ... FROM MyTable WHERE id > $random LIMIT 1
Run Code Online (Sandbox Code Playgroud)

您使用>而不是=的原因是由于行被删除或回滚,您可能在ID中存在间隙,或者您的WHERE子句中可能有其他条件,因此您的行之间存在与您的条件匹配的间隙.

这种大于方法的缺点:

  • 这种差距之后的行有更高的被选择机会,差距越大,机会越大.
  • 在生成随机值之前,您需要知道MIN(id)和MAX(id).
  • 如果您需要多个随机行,则不起作用.

这种方法的优点:

  • 它比ORDER BY RAND()快得多,即使对于适度的表大小也是如此.
  • 您可以在SQL之外使用随机函数.

  • 正确,它只是基于种子的算术进展.我没有权利在这里发布代码,但你应该下载MySQL的源代码并阅读我上面提到的my_rnd()函数.它只有三行长. (2认同)