15 萬表 ORDER BY RAND() LIMIT 5 耗時 8 秒+。
JOIN + MAX(id)*RAND() → 連續 5 條 → 改單條循環 5 次(0.01s/次)WHERE id >= FLOOR(MAX*RAND()) → 0.5sWHERE id >= FLOOR(RAND()*MAX) → 0.01s
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;
LIMIT N → 產生連續塊
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;
效能約 JOIN 版 10 倍(0.147s vs 0.015s)。