[英]MYSQL: Query order by rand() very slow
我必須從表中選擇30個隨機記錄,除了查詢使用一秒鍾,如果許多用戶顯示內容,這會減慢mysql的速度。 這是查詢:
SELECT relationship, COUNT(id) AS number FROM FR_user_friends GROUP BY relationship ORDER BY rand() LIMIT 30
你知道如何加快這個查詢嗎? 謝謝。
如果我刪除rand(),查詢速度很快。 我們必須找到rand()的替代方案
ORDER BY RAND()使引擎為所有行生成隨機值,因此如果要從大表中選擇幾行,則會產生非常糟糕的性能。
例如,您可以在[1,最大行ID]范圍內的php中生成30個隨機值,並選擇第一行的行ID大於或等於LIMIT 1
的隨機值。
您可以在如何優化MySQL的ORDER BY RAND()函數中找到只處理SQL的方法嗎? (但有些也不是微不足道的)。
RAND()
函數太慢並且消耗太多CPU。 它為每一行生成一個隨機數,並選擇最小的一個,這就是為什么它如此慢。
為了加快速度,您可以在PHP中生成一個隨機數,並在LIMIT
子句中使用,如下所示:
$firstClauseLimit = rand(0,20); // create an int random number between 0 to 20
"... ... LIMIT $firstClauseLimit,1"
通過這種方式,它會更快。
此查詢應該比您的查詢快得多
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
我還建議在這里閱讀更多內容: 什么會更快?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.