所以我有一个包含超过80,000条记录的表,这一条称为系统.我还有另一个名为follow的表.
我需要我的语句从系统表中随机选择记录,其中该id尚未列在当前用户标识下的下表中.
所以这就是我所拥有的:
SELECT system.id,
system.username,
system.password,
system.followed,
system.isvalid,
follows.userid,
follows.systemid
FROM system
LEFT JOIN follows ON system.id = follows.systemid
AND follows.userid = 2
WHERE system.followed = 0
AND system.isvalid = 1
AND follows.systemid IS NULL
ORDER BY RAND()
LIMIT 200
Run Code Online (Sandbox Code Playgroud)
现在它完美无瑕,除了它需要大约一分钟才能开始处理他们所选择的记录.到这个时候,脚本通常会超时并且没有任何反应.
有人可以告诉我如何重做这个,所以同样的想法已经完成,但它没有使用兰德的命令?这似乎减慢了一大堆.
谢谢!
我不确定是否有一个简单的解决方案来替换您的查询,这里有一篇关于纠正此类问题的文章.
http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/
查询速度慢的原因是数据库需要保留所有生成的随机值及其各自数据的表示,然后才能返回数据库中的单行.你可以做的是通过使用WHERE RAND()<x来限制首先考虑的候选行数,其中你选择x作为一个可能至少返回你需要的样本数的数字.要获得真正的随机样本,您需要再次通过RAND排序或对返回的数据集进行采样.
使用此方法允许数据库以流方式处理查询,而无需构建所有数据的大型中间表示.缺点是您永远无法100%确定您获得所需的样本数量,因此您可能需要再次执行查询,直到您使用较小的样本集或逐步添加样本(确保避免重复) )直到你有你需要的样品数量.
如果您不要求查询为每个调用返回不同的结果,您还可以添加带有索引的预生成随机值列并与上述技术结合使用.它允许您以公平的方式获取任意数量的样本,即使您添加或删除行,但对相同数据的相同查询当然会返回相同的结果集.