MYSQL:rand()的查询顺序非常慢

时间:2016-02-26 18:27:28

标签: php mysql

我必须从表中选择30个随机记录,但查询使用一秒,如果许多用户显示内容,这会减慢mysql的速度。 这是查询:

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

你知道如何加快这个查询吗?谢谢。

如果删除rand(),查询速度很快。我们必须找到rand()

的替代方案

3 个答案:

答案 0 :(得分:6)

ORDER BY RAND()使引擎为所有行生成随机值,因此如果要从大表中选择几行,则会产生非常糟糕的性能。

例如,您可以在[1,最大行ID]范围内的php中生成30个随机值,并选择第一行,其行ID大于或等于LIMIT 1的随机值。

How can i optimize MySQL's ORDER BY RAND() function?中找到的只处理SQL的方法(但有些方法也不简单)。

答案 1 :(得分:1)

RAND()函数太慢并且消耗太多CPU。它会为每一行生成一个随机数,并选择最小的一行,这就是为什么它这么慢。

为了加快速度,您可以在PHP中生成一个随机数并在LIMIT中使用  像这样的条款:

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

"... ... LIMIT $firstClauseLimit,1"
通过这种方式,它会更快。

答案 2 :(得分:0)

此查询应该比您的

快得多
jwilder/nginx-proxy

我还建议您在此处阅读更多内容:What would be faster?