SELECT * FROM `table` ORDER BY RAND() LIMIT 5;
此寫法會產生臨時表並對全表排序,時間複雜度 O(N log N),百萬筆資料查詢可達秒級,極不適合生產環境高頻呼叫。
SELECT * FROM `table`
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 5;
-- 1. 先取隨機 ID 列表
SELECT id FROM `table`
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`)))
LIMIT 100;
-- 2. 應用層隨機挑選 5 個 ID,再 IN 查詢
SELECT * FROM `table` WHERE id IN (id1, id2, id3, id4, id5);
SELECT * FROM `table` TABLESAMPLE SYSTEM (1) LIMIT 5;
-- 一次性更新所有行的 views 為隨機值
UPDATE `cdb_posts` SET `views` = FLOOR(RAND() * 10000);
RAND():每次呼叫產生不同值RAND(N):固定種子 N,同一查詢內多次呼叫回傳相同序列| 資料量 | 推薦方案 | 預估耗時 |
|---|---|---|
| < 1 萬筆 | ORDER BY RAND() | < 100ms |
| 1 萬 ~ 100 萬 | 主鍵範圍 + LIMIT | 10~50ms |
| > 100 萬 | TABLESAMPLE / 兩階段查詢 | < 20ms |