| 方案 | SQL 核心 | 優點 | 缺點 |
|---|---|---|---|
| ORDER BY RAND() | ORDER BY RAND() LIMIT 1 | 最簡單、真隨機 | 全表掃描、極慢 |
| MAX(id)*RAND() | WHERE id >= (SELECT FLOOR(RAND()*MAX(id))) | 快 | ID 不從 1 起時偏向前段 |
| MIN/MAX 邊界修正 | WHERE id >= (SELECT FLOOR(RAND()*(MAX-MIN)+MIN)) | 修正偏移 | WHERE 子查詢較慢 |
| JOIN + 邊界修正(推薦) | JOIN (SELECT ROUND(RAND()*(MAX-MIN)+MIN) AS id) t2 ON t1.id>=t2.id | 最快(0.015s) | 需主鍵連續/較密 |
循環呼叫單條隨機 SQL N 次,去重。15 萬表單次 0.015s,10 次僅 0.15s。
SELECT * FROM `table` AS t1
JOIN (
SELECT ROUND(RAND() * (MAX(id)-MIN(id)) + MIN(id)) AS id
FROM `table` LIMIT 50
) AS t2 ON t1.id = t2.id
LIMIT 10;
LIMIT 50 產生 50 個隨機 ID(可能重複)LIMIT 10 取前 10 筆CAST(UUID() AS BINARY) 或建立映射表 id_map(auto_id, uuid)rand_sort 欄位定期 UPDATE SET rand_sort=RAND() 後 ORDER BY rand_sort