MySQL 內建 RAND() 函數支援隨機排序與數值生成,結合 LIMIT 可輕鬆實現隨機抽樣;批次更新則可直接對全表欄位賦隨機值。本文示範兩大場景實操與效能提醒。
SELECT * FROM table_name ORDER BY RAND() LIMIT 5;
RAND() 返回 0~1 浮點數,可指定種子 RAND(N) 固定序列:
mysql> SELECT RAND(); -- 0.5925
mysql> SELECT RAND(20); -- 0.1811(固定種子)
mysql> SELECT RAND(20); -- 0.1811(同種子結果相同)
ORDER BY RAND() 會觸發全表掃描並生成臨時表排序,資料量超過萬筆時效能急劇下降。大表替代方案:
WHERE id >= rand_id LIMIT 1SELECT COUNT(*) 取總數 → 應用層隨機 OFFSET → LIMIT 1 OFFSET n需求:為測試生成上萬筆測試資料的 views 欄位隨機值。
UPDATE cdb_posts SET views = RAND();
單條敘述即可更新全表,避免應用層迴圈逐筆 UPDATE 的網路往返開銷。
INSERT INTO tbl (rand_col) VALUES (RAND());
注意欄位寬度:RAND() 產生如 0.123456,若欄位定義 DECIMAL(3,2) 會截斷。
RAND() * 100 → 0~100 隨機整數(配合 FLOOR())ORDER BY RAND() LIMIT 1 取單筆隨機行(小表適用)| 場景 | 推薦寫法 | 適用規模 |
|---|---|---|
| 小表隨機抽樣 | ORDER BY RAND() LIMIT N | < 1 萬行 |
| 大表隨機抽樣 | 應用層隨機 ID + 主鍵查詢 | 任意規模 |
| 全表欄位隨機化 | UPDATE tbl SET col = RAND() | 批次維護窗口 |
善用 RAND() 簡化測試資料生成與抽樣邏輯,但大表隨機排序務必謹慎評估效能影響。