最直覺的 ORDER BY RAND() LIMIT N 在大表極慢(全表排序)。本文提供基礎寫法、兩種高效子查詢方案並附實測效能對比。
SELECT `title`, `id` FROM news ORDER BY RAND() LIMIT 0, 5;
資料 < 2,000 筆可接受;超過會明顯拖慢。
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 id
) AS t2 ON t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
實測 10 次平均 0.015 秒。
SELECT * FROM `table`
WHERE id >= (
SELECT FLOOR(RAND() * ((SELECT MAX(id) FROM `table`) - (SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))
)
ORDER BY id LIMIT 1;
實測 10 次平均 0.147 秒,慢近 10 倍。
[MIN, MAX]WHERE id >= 隨機值 ORDER BY id LIMIT N 直接定位,避免全表排序ORDER BY RAND() 或應用層抽樣結論:百萬級以上表強烈建議用 JOIN 子查詢方案;小表直用 RAND() 即可。