5

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

4

2 回答 2

8

order byRAND()可能很慢的原因是您强制数据库在返回任何内容之前对整个表进行实际排序。仅将负载减少到单个表扫描会快得多(尽管仍然有些慢)。

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

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

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

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

于 2013-06-04T22:18:44.990 回答
2

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

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

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

于 2013-06-04T22:00:40.183 回答