ORDER BY RAND() 在 MySQL 中如何運作,為什麼這麼慢?

Barbara Streisand
發布: 2024-11-04 06:07:01
原創
523 人瀏覽過

How Does ORDER BY RAND() Work in MySQL, and Why Is It So Slow?

理解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 欄位已建立索引,因此檢索速度更快。將使用者名稱加到結果中需要從每一行讀取它,從而減慢操作速度。在 * 的情況下,所有列(包括可變長度的列)都需要載入到記憶體中,這會進一步影響效能。

快速隨機選擇的替代方案

對於有效的隨機行選擇,請考慮以下替代方案:

  • 德國部落客的檔案中所描述的過程(web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql- order-by-rand-a-case-study-of-alternatives/)。
  • 使用 Jay 的方法,儘管其複雜性增加,以獲得最佳速度。
  • 採用以下兩個查詢方法為簡單起見:
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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板