首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 隨機抽取記錄:利用 ID 範圍 + RAND() 避免全表排序

     編輯:MySQL 綜合教學

高效隨機查詢(百萬級表秒出)

SELECT * FROM t_room
WHERE fid >= (
    (SELECT MAX(fid) FROM t_room) - (SELECT MIN(fid) FROM t_room)
) * RAND() + (SELECT MIN(fid) FROM t_room)
LIMIT 10;

原理解析

  1. 計算 ID 範圍:MAX - MIN
  2. RAND() 產生 [0,1) 隨機數,乘以範圍得偏移量
  3. 加上 MIN 得到隨機起始 ID
  4. WHERE fid >= 隨機起始 ID 利用索引定位,取後 10 行

避開 ORDER BY RAND() 全表掃描 + 文件排序的災難性性能。

適用條件與缺陷

  • ✅ ID 連續/較密集、有主鍵索引
  • ❌ ID 稀疏/大量刪除導致空洞多 → 分布不均
  • ❌ 需嚴格均勻隨機 → 仍需 ORDER BY RAND()(小表可用)

進階:兩步法保證均勻

-- 1. 取總行數
SELECT COUNT(*) INTO @cnt FROM t_room;
-- 2. 隨機偏移
SET @offset = FLOOR(RAND() * @cnt);
-- 3. 利用主鍵定位(需覆蓋索引)
SELECT * FROM t_room LIMIT @offset, 10;

適合中等表(十萬級),大表仍建議 ID 範圍法。

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