我需要从一张表中随机选择30条记录,但是查询时间不能超过1秒,否则当多个用户访问时会拖慢mysql的速度。
这是查询语句:
SELECT relationship, COUNT(id) AS number FROM FR_user_friends GROUP BY relationship ORDER BY rand() LIMIT 30
您知道如何加快此查询速度吗?谢谢。
如果我去掉 rand(),查询速度就很快。我们必须找到替代 rand() 的方法。
我需要从一张表中随机选择30条记录,但是查询时间不能超过1秒,否则当多个用户访问时会拖慢mysql的速度。
这是查询语句:
SELECT relationship, COUNT(id) AS number FROM FR_user_friends GROUP BY relationship ORDER BY rand() LIMIT 30
您知道如何加快此查询速度吗?谢谢。
如果我去掉 rand(),查询速度就很快。我们必须找到替代 rand() 的方法。
ORDER BY RAND()会使引擎为所有行生成随机值,因此如果您想从大表中选择几行,则性能非常差。
例如,您可以在php中生成30个在范围[1,最大行号]内的随机值,并选择第一个行号大于或等于随机值的行,带上 LIMIT 1
.
SQL-only的解决方法可以在How can i optimize MySQL's ORDER BY RAND() function?找到(但一些也不是那么简单)。
这个查询应该比你的查询快得多
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
我还建议在这里阅读更多:哪个更快?
RAND()
函数速度太慢,消耗CPU过多。它为每一行生成一个随机数并选择最小的那个,所以速度很慢。
为了加快速度,您可以在PHP中生成一个随机数,并在LIMIT
子句中使用,如下所示:
$firstClauseLimit = rand(0,20); // create an int random number between 0 to 20
"... ... LIMIT $firstClauseLimit,1"