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

MySQL 獲取隨機資料的高效能方法總結

     編輯:MySQL 資料庫相關知識

MySQL 隨機查詢效能優化實戰

直接使用 ORDER BY RAND() 在大數據量下極慢,本文對比多種隨機抽樣方案,助你選擇最適合的方法。

方案對比

1. ORDER BY RAND() — 僅適合極小資料量

SELECT * FROM table_name ORDER BY RAND() LIMIT 10;

優點:隨機性完美。缺點:全表掃描、多次計算 RAND(),萬筆以上明顯卡頓。

2. JOIN + 子查詢產生隨機 ID — 速度極快,但回傳連續資料

SELECT * FROM table_name AS r1
JOIN (
    SELECT ROUND(RAND() * (
        SELECT ABS(MAX(id) - MIN(id) - :limit) FROM table_name
    ) + (SELECT MIN(id) FROM table_name)) AS id
) AS r2 ON r1.id >= r2.id
ORDER BY r1.id ASC LIMIT :limit;
  • 原理:子查詢先算出一個隨機起始 ID,主查詢向後取 N 筆。
  • 缺點:結果為連續 ID,非真正離散隨機。
  • 關鍵細節:需扣除 :limit 避免不足;需加 MIN(id) 因 ID 可能不從 1 起。

3. WHERE RAND() < 機率值 — 速度快,但筆數不固定

SELECT * FROM test WHERE RAND() > 0.0005 LIMIT 10;
  • 機率值 = 目標筆數 / 總筆數(如 300/10000 = 0.03)。
  • 符合常態分佈,每次回傳筆數波動,需多查幾次湊齊。

手冊公式參考

若要在 i ≤ R ≤ j 取隨機整數:

SELECT FLOOR(i + RAND() * (j - i + 1));
-- 例:7~12 之間
SELECT FLOOR(7 + (RAND() * 6));

總結建議

  • 極小表:ORDER BY RAND()
  • 大表、需固定筆數、可接受連續:JOIN 方案
  • 大表、需真正離散、筆數可浮動:WHERE RAND() < p
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved