SELECT * FROM t_room
WHERE fid >= (
(SELECT MAX(fid) FROM t_room) - (SELECT MIN(fid) FROM t_room)
) * RAND() + (SELECT MIN(fid) FROM t_room)
LIMIT 10;
MAX - MINRAND() 產生 [0,1) 隨機數,乘以範圍得偏移量MIN 得到隨機起始 IDWHERE fid >= 隨機起始 ID 利用索引定位,取後 10 行避開 ORDER BY RAND() 全表掃描 + 文件排序的災難性性能。
ORDER BY RAND()(小表可用)-- 1. 取總行數
SELECT COUNT(*) INTO @cnt FROM t_room;
-- 2. 隨機偏移
SET @offset = FLOOR(RAND() * @cnt);
-- 3. 利用主鍵定位(需覆蓋索引)
SELECT * FROM t_room LIMIT @offset, 10;
適合中等表(十萬級),大表仍建議 ID 範圍法。