首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 隨機抽取 N 條不重複記錄高效寫法

     編輯:MySQL 資料庫相關知識

MySQL 隨機取 N 條:從 8 秒優化到 0.01 秒的演進

問題現場

15 萬表 ORDER BY RAND() LIMIT 5 耗時 8 秒+。

演進路線

  1. JOIN + MAX(id)*RAND() → 連續 5 條 → 改單條循環 5 次(0.01s/次)
  2. WHERE id >= FLOOR(MAX*RAND()) → 0.5s
  3. WHERE id >= FLOOR(RAND()*MAX) → 0.01s
  4. 加入 MIN 邊界修正 → 修正 ID 不從 1 起的偏移
  5. JOIN 版完美方案 → 0.015s(10 次測試平均)

最終推薦 SQL(單條)


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;

取 N 條不重複策略

  • 應用層循環執行上述 SQL N 次,用集合去重
  • 若 N 較小(≤20),總耗時 < 0.3s,極具性價比
  • 避免單 SQL LIMIT N → 產生連續塊

WHERE 子查詢版(備選)


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)。

適用前提

  • 表有數字型主鍵(自增或較密)
  • 可接受「非完美均勻」(稀疏 ID 區概率低)
  • 極高均勻需求 → 額外隨機排序欄位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved