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

SQL 隨機抽取 N 條記錄:MySQL 與 SQL Server 語法對比

     編輯:MySQL 資料庫相關知識

核心語法

數據庫語句說明
MySQLSELECT * FROM tbl ORDER BY RAND() LIMIT 10;RAND() 生成 0-1 隨機數排序,LIMIT 取前 N 行
SQL ServerSELECT TOP 10 * FROM tbl ORDER BY NEWID();NEWID() 生成唯一標識符排序,TOP 取前 N 行

性能提示

  • 兩者均需全表掃描 + 臨時表排序,大表(>10 萬行)極慢
  • MySQL RAND() 在 8.0+ 可優化,但仍不適合大數據量
  • SQL Server NEWID() 同理

大表優化替代方案

方案一:主鍵範圍隨機(適用於連續/近似連續 ID)

-- MySQL
SELECT * FROM tbl
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM tbl)))
ORDER BY id LIMIT 10;

-- SQL Server
SELECT TOP 10 * FROM tbl
WHERE id >= (SELECT CAST(RAND() * (SELECT MAX(id) FROM tbl) AS INT))
ORDER BY id;

方案二:TABLESAMPLE (SQL Server 2005+)

SELECT * FROM tbl TABLESAMPLE (10 ROWS);
-- 或百分比
SELECT * FROM tbl TABLESAMPLE (1 PERCENT);

注意:TABLESAMPLE 基於頁採樣,不保證精確行數,且需統計信息較新。

方案三:預計算隨機值列 + 索引

ALTER TABLE tbl ADD rand_val DOUBLE;
UPDATE tbl SET rand_val = RAND(); -- 或 NEWID() 轉換
CREATE INDEX idx_rand ON tbl(rand_val);

-- 查詢
SELECT * FROM tbl ORDER BY rand_val LIMIT 10;

定期 UPDATE tbl SET rand_val = RAND() 刷新隨機性。

總結建議

  1. 小表(<1 萬行)直接用 ORDER BY RAND()/NEWID()
  2. 中表(1-10 萬)考慮主鍵範圍法
  3. 大表(>10 萬)必須用預計算隨機列或應用層邏輯(先 COUNT(*),再隨機 OFFSET)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved