MySQL RAND() 可實現隨機讀取/更新,但大表 ORDER BY RAND() 效能極差。本文提供基礎寫法、隨機更新技巧、效能陷阱分析與適用邊界。
-- 基礎寫法 (小表 < 2000 行)
SELECT * FROM your_table ORDER BY RAND() LIMIT 6;
-- 隨機範圍 (PHP 產生隨機 LIMIT)
$num = rand(5,10);
$sql = "SELECT * FROM your_table ORDER BY RAND() LIMIT $num";
-- 將 views 欄位更新為隨機值
UPDATE cdb_posts SET views = RAND();
-- INSERT 時賦隨機值
INSERT INTO t (val) VALUES (RAND()), (RAND()), ...;
⚠️ 確保表資料量 ≥ 更新筆數,否則會報錯或行為異常。
ORDER BY RAND() 會為每行產生隨機數 → 臨時表 → 檔案排序 → 取前 NEXPLAIN 會顯示 Using temporary; Using filesortSELECT COUNT(*),PHP 產生隨機 ID 陣列 → WHERE id IN (...)WHERE id >= (SELECT FLOOR(RAND() * (MAX(id)-MIN(id)+1)) + MIN(id)) ORDER BY id LIMIT NTABLESAMPLE SYSTEM (10) (伯努利採樣)| 資料量 | 推薦方案 |
|---|---|
| < 2,000 | ORDER BY RAND() LIMIT N 直觀可接受 |
| 2,000 ~ 100,000 | 主鍵範圍隨機或應用層抽樣 |
| > 100,000 | 應用層抽樣 / 專用採樣表 / Redis 集合隨機 |