直接使用 ORDER BY RAND() 在大數據量下極慢,本文對比多種隨機抽樣方案,助你選擇最適合的方法。
SELECT * FROM table_name ORDER BY RAND() LIMIT 10;
優點:隨機性完美。缺點:全表掃描、多次計算 RAND(),萬筆以上明顯卡頓。
SELECT * FROM table_name AS r1
JOIN (
SELECT ROUND(RAND() * (
SELECT ABS(MAX(id) - MIN(id) - :limit) FROM table_name
) + (SELECT MIN(id) FROM table_name)) AS id
) AS r2 ON r1.id >= r2.id
ORDER BY r1.id ASC LIMIT :limit;
:limit 避免不足;需加 MIN(id) 因 ID 可能不從 1 起。SELECT * FROM test WHERE RAND() > 0.0005 LIMIT 10;
若要在 i ≤ R ≤ j 取隨機整數:
SELECT FLOOR(i + RAND() * (j - i + 1));
-- 例:7~12 之間
SELECT FLOOR(7 + (RAND() * 6));
ORDER BY RAND()WHERE RAND() < p