SELECT * FROM table_name ORDER BY RAND() LIMIT 5;
原理:為每行生成隨機數排序。缺點:全表掃描 + 臨時表 + filesort,8000 行約 0.08 秒,資料量增大時效能急劇下降。
SELECT *
FROM table_name AS r1
JOIN (
SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id
) AS r2 ON r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 5;
原理:利用主鍵 ID 連續性,隨機取一個起始點,向後取 N 行。優勢:同樣 8000 行僅 0.02 秒,提升 4 倍;適合大表隨機抽樣。
OFFSET FLOOR(RAND() * COUNT(*)) LIMIT 1 但需兩次查詢