-- 從 tt_dvjobs 隨機取 10 條
SELECT * FROM `tt_dvjobs` ORDER BY RAND() LIMIT 0, 10;
RAND() 會為每行生成隨機數,然後全表排序。大表時需生成海量隨機數並排序,極其消耗 CPU 與臨時表空間,導致查詢極慢。
SELECT * FROM `table`
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 10;
-- 1. 取總行數
SELECT COUNT(*) INTO @total FROM `table`;
-- 2. 應用層生成隨機偏移
SET @offset = FLOOR(RAND() * @total);
-- 3. 取數據
PREPARE stmt FROM 'SELECT * FROM `table` LIMIT ?, 10';
EXECUTE stmt USING @offset;
# 應用層取得隨機 ID 列表
$ids = range(1, $maxId); shuffle($ids); $ids = array_slice($ids, 0, 10);
# SQL
SELECT * FROM `table` WHERE id IN (?,?,...);
ORDER BY RAND()RAND(),採用方案 2 或 3