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

MySQL 隨機查詢優化:從 ORDER BY RAND() 到高效能分頁抽樣

     編輯:MySQL 資料庫相關知識

經典寫法與效能陷阱

SELECT * FROM `table` ORDER BY RAND() LIMIT 5;

此寫法會產生臨時表並對全表排序,時間複雜度 O(N log N),百萬筆資料查詢可達秒級,極不適合生產環境高頻呼叫。

高效能替代方案

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

SELECT * FROM `table`
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 5;

方案二:兩階段查詢(適用離散 ID)

-- 1. 先取隨機 ID 列表
SELECT id FROM `table` 
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`)))
LIMIT 100;

-- 2. 應用層隨機挑選 5 個 ID,再 IN 查詢
SELECT * FROM `table` WHERE id IN (id1, id2, id3, id4, id5);

方案三:TABLESAMPLE(MySQL 8.0.24+)

SELECT * FROM `table` TABLESAMPLE SYSTEM (1) LIMIT 5;

隨機更新大量資料

-- 一次性更新所有行的 views 為隨機值
UPDATE `cdb_posts` SET `views` = FLOOR(RAND() * 10000);

RAND() 種子特性

  • RAND():每次呼叫產生不同值
  • RAND(N):固定種子 N,同一查詢內多次呼叫回傳相同序列

效能對比建議

資料量推薦方案預估耗時
< 1 萬筆ORDER BY RAND()< 100ms
1 萬 ~ 100 萬主鍵範圍 + LIMIT10~50ms
> 100 萬TABLESAMPLE / 兩階段查詢< 20ms
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved