RAND() 函數生成 0~1 之間的隨機浮點數,支援種子參數實現可重現序列,常用於隨機抽樣、打亂順序、A/B 測試分桶等場景。本文詳細講解無種子/有種子調用差異、ORDER BY RAND() 隨機排序實戰及性能優化建議。
SELECT RAND(), RAND(), RAND();
每次執行結果不同,例如:0.4546, 0.1824, 0.5482。
SELECT RAND(1), RAND(), RAND();
首次 RAND(1) 設置種子,後續無參數 RAND() 將按內部算法產生固定序列:0.1811, 0.7502, 0.2079。同一連接會話中,相同種子產生的序列完全一致,便於測試驗證與複現。
對 employee_tbl 進行隨機打亂:
SELECT * FROM employee_tbl ORDER BY RAND();
每次執行返回行順序不同,實現「洗牌」效果。經典用例:
SELECT * FROM table ORDER BY RAND() LIMIT 10問題:ORDER BY RAND() 會為每行生成隨機數、建立臨時表、文件排序,時間複雜度 O(N log N)。百萬級表將極其緩慢甚至 OOM。
ORDER BY RAND() LIMIT N 可接受。SELECT * FROM table WHERE id >= (SELECT FLOOR(MAX(id)*RAND())) ORDER BY id LIMIT N(需連續 ID)。SELECT COUNT(*),隨機生成 offset,再 LIMIT offset, N。TABLESAMPLE(MySQL 8.0+ 支援 BERNOULLI/SYSTEM 採樣)。RAND() 簡單易用,但 ORDER BY RAND() 在大表上是性能殺手。理解種子機制可用於測試複現;生產環境隨機抽樣請根據數據量選擇高效方案,避免全表掃描排序。