php MYSQL:按兰德()排序查询非常慢

rn0zuynd  于 2022-12-10  发布在  PHP
关注(0)|答案(3)|浏览(117)

我必须从一个表中随机选取30条记录,只是查询需要一秒钟,如果内容由许多用户显示,这会降低mysql的速度。

SELECT relationship, COUNT(id) AS number FROM FR_user_friends GROUP BY relationship ORDER BY rand() LIMIT 30

您知道如何加快查询速度吗?谢谢。
如果我删除兰德(),查询会很快。我们必须找到rand()的替代方法

hsvhsicv

hsvhsicv1#

ORDER BY兰德()会导致引擎为所有行生成随机值,因此,如果要从大型表中选择几行,则性能会非常差.
例如,您可以在php中生成30个随机值,取值范围为[1,maximum row-id],并选择row-id大于或等于随机值LIMIT 1的第一行。
您可以在How can i optimize MySQL's ORDER BY RAND() function?中找到处理此问题的仅SQL方法(但有些方法也不简单)。

c6ubokkw

c6ubokkw2#

RAND()函数太慢了,占用了太多的CPU。它为每一行生成一个随机数,并选择最小的一个,这就是为什么它这么慢。
为了加快速度,可以在PHP中生成一个随机数,并在LIMIT子句中使用,如下所示:

$firstClauseLimit = rand(0,20); // create an int random number between 0 to 20

"... ... LIMIT $firstClauseLimit,1"

这样的话,速度会更快。

eit6fx6z

eit6fx6z3#

此查询应该比您的

SELECT relationship, id 
FROM FR_user_friends fr1 
JOIN (
  SELECT CEIL(RAND() * ( SELECT MAX(id) FROM FR_user_friends )) AS id ) AS fr2 
  ON fr1.id >= fr2.id 
  LIMIT 0,30

我也建议在这里多读一些:什么更快?

相关问题