理解MySQL 中的ORDER BY RAND()
雖然ORDER BY RAND() 語法看起來很簡單,但其內部運作原理可能很神秘。本文深入探討了此操作背後的機制,並解決了一些意外的效能差異。
ORDER BY RAND() 函數如何
最初,人們認為 ORDER BY RAND () 將一列隨機值加到表中並根據該值進行排序。然而,後續研究顯示 Jay 提出的方法明顯更快:
SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;
此方法會在現有 ID 範圍內產生隨機 ID,並檢索第一個符合行。
效能變化
有趣的是,ORDER BY RAND() 的效能會根據結果中包含的列而變化:
SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 seconds*/ SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25 seconds*/ SELECT id, username FROM table ORDER BY RAND() LIMIT 1; /*90 seconds*/
這種差異可以歸因於索引。 id 欄位已建立索引,因此檢索速度更快。將使用者名稱加到結果中需要從每一行讀取它,從而減慢操作速度。在 * 的情況下,所有列(包括可變長度的列)都需要載入到記憶體中,這會進一步影響效能。
快速隨機選擇的替代方案
對於有效的隨機行選擇,請考慮以下替代方案:
SELECT id FROM table ORDER BY RAND() LIMIT 1; SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;
以上是ORDER BY RAND() 在 MySQL 中如何運作,為什麼這麼慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!