返回随机结果(按rand()排序)

php*_*_qq 5 mysql random

我记得在某个地方读过使用rand()的命令很糟糕,我刚刚开始发表它并发现了一篇证明它的文章.对于大型数据库,rand()的顺序可能非常慢,建议的解决方案是在php中生成一个随机数并根据它进行选择.问题是我需要验证其他字段才能返回我的记录.我可能还删除了一些旧记录,这也可能导致问题.任何人都可以提供一种合适的方法从表中选择一些匹配某些条件的随机记录(例如字段paid必须等于1)?

mze*_*ler 8

排序依据RAND()缓慢的原因是您在返回任何内容之前强制数据库实际对整个表进行排序.将负载减少到单个表扫描要快得多(尽管仍然有点慢).

这意味着您可以通过避免排序来获得部分方式:

  SELECT *
    FROM my_table
   WHERE RAND() < 0.1
ORDER BY RAND()
   LIMIT 100
Run Code Online (Sandbox Code Playgroud)

这将选择表中所有行的大约1%,对它们进行排序并返回前100位.请注意,此处的主要问题(以及@ cmd的答案)是您无法确定查询是否返回什么都没有.

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


cmd*_*cmd 2

您需要它们有多随机?如果你不需要超级均匀的分布试试这个

select min(pk_id) from my_table where pk_id > %(random_number)s and paid=1 
Run Code Online (Sandbox Code Playgroud)

其中是一个绑定变量,其中包含每次运行查询时重新生成的%(random_number)s随机数 from0max(pk_id)-1