我记得在某个地方读过使用rand()的命令很糟糕,我刚刚开始发表它并发现了一篇证明它的文章。对于大型数据库,rand()的顺序可能非常慢,建议的解决方案是在php中生成一个随机数并根据它进行选择。问题是我需要验证其他字段才能返回我的记录。我可能还删除了一些旧记录,这也可能导致问题。任何人都可以提供一种合适的方法从表格中选择一些符合某些条件的随机记录(例如,字段paid
必须等于1)?
答案 0 :(得分:8)
RAND()
排序速度慢的原因是您在返回任何内容之前强制数据库实际对整个表进行排序。只需将负载减少到单个表扫描速度要快得多(尽管仍然有点慢)。
这意味着您可以通过避免排序来获得部分内容:
SELECT *
FROM my_table
WHERE RAND() < 0.1
ORDER BY RAND()
LIMIT 100
这将选择表格中所有行的大约1%,对它们进行排序并返回前100位。请注意,此处的主要问题(以及@ cmd&#39; s答案)是您可以&# 39;确保查询返回任何内容。
上面的方法应该包括整个表扫描(以决定使用哪些行),然后是大约1%的行。如果您有很多行,则可以相应地减少百分比。
答案 1 :(得分: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
的随机数