| 方案 | 語法核心 | 速度 | 隨機性 | 適用場景 |
|---|---|---|---|---|
| 1. ORDER BY RAND() | ORDER BY RAND() LIMIT N | 極慢 (O(N log N)) | 完美均勻 | <1萬行 |
| 2. JOIN + 隨機 ID (連續塊) | WHERE id >= RAND()*MAX(id) | 極快 (ms級) | 連續 N 行 | 不要求嚴格隨機、大表抽樣 |
| 3. 概率採樣 | WHERE RAND() < p LIMIT N | 快 | 近似均勻 | 大表近似隨機、結果數量不固定 |
SELECT * FROM `table` AS t1
JOIN (
SELECT ROUND(
RAND() * (
(SELECT MAX(id) FROM `table`) - (SELECT MIN(id) FROM `table`)
) + (SELECT MIN(id) FROM `table`)
) AS rand_id
) AS t2 ON t1.id >= t2.rand_id
ORDER BY t1.id LIMIT 1;
MIN(id) 修正非 1 起始/稀疏 IDROUND 比 FLOOR 分佈更均勻
-- 表 10000 行,需約 300 行 → p = 300/10000 = 0.03
SELECT * FROM t WHERE RAND() < 0.03 LIMIT 300;
ORDER BY RAND() : 8.2 秒
JOIN 子查詢 (單條循環10次) : 0.147 秒
JOIN 直接 LIMIT 10 : 0.015 秒 (連續塊)
ORDER BY RAND() LIMIT N 簡單可靠WHERE RAND() < p LIMIT N(p = 目標數/總數)
-- 定時任務每小時刷新
CREATE TABLE random_sample AS
SELECT id FROM large_table ORDER BY RAND() LIMIT 10000;
-- 業務查詢
SELECT * FROM large_table WHERE id IN (SELECT id FROM random_sample) LIMIT 10;
將隨機計算從線上查詢剝離,線上僅做索引查找,極致性能。
COUNT(*) 慢 → 緩存總行數或用 TABLE_ROWS 估算計算 pRAND() 在主從間不一致,勿在備份/同步 SQL 中使用