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

MySQL 表隨機抽樣:ORDER BY RAND() 與高效能替代方案

     編輯:MySQL 資料庫相關知識

基本寫法:ORDER BY RAND()

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

RAND() 函數說明

  • RAND():回傳 0~1.0 隨機浮點數
  • RAND(N):指定種子值,相同種子產生相同序列
mysql> SELECT RAND();      -- 0.5925
mysql> SELECT RAND(20);  -- 0.1811
mysql> SELECT RAND(20);  -- 0.1811 (相同種子,結果相同)
mysql> SELECT RAND();    -- 0.2079

效能問題

ORDER BY RAND() 會對全表掃描並為每列計算隨機值,再排序。

  • 8,000 筆測試:約 0.08 秒
  • 資料量增長時效能急劇下降

高效能替代方案(需 MySQL 4.1+ 子查詢支援)

SELECT * 
FROM table_name AS r1 
JOIN (
    SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id
) AS r2 
WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 5;

原理

  1. 取得最大 ID 值
  2. 產生隨機數乘以最大 ID,得到隨機起始點
  3. 從該起始點向後取 N 筆

效能提升

  • 同樣 8,000 筆測試:約 0.02 秒(快 4 倍)
  • 避免全表排序,利用索引範圍掃描

適用條件與限制

  • 需要 MySQL 4.1 以上(支援子查詢)
  • 表需有連續或近似連續的數值型主鍵(id)
  • 資料分布均勻時效果最佳;有大量刪除導致 ID 稀疏時可能抽樣偏差

進階改良:真正隨機多行

若需真正隨機的多行(非連續區塊),可重複執行上述查詢多次,或結合應用層邏輯處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved