我必须从表中选择30个随机记录,但查询使用一秒,如果许多用户显示内容,这会减慢mysql的速度。 这是查询:
SELECT relationship, COUNT(id) AS number FROM FR_user_friends GROUP BY relationship ORDER BY rand() LIMIT 30
你知道如何加快这个查询吗?谢谢。
如果删除rand(),查询速度很快。我们必须找到rand()
的替代方案答案 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)