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

MySQL 隨機查詢:ORDER BY RAND() 易用但慎用,大表性能殺手

     編輯:MySQL 綜合教學

基本用法

-- 從 tt_dvjobs 隨機取 10 條
SELECT * FROM `tt_dvjobs` ORDER BY RAND() LIMIT 0, 10;

原理與性能陷阱

RAND() 會為每行生成隨機數,然後全表排序。大表時需生成海量隨機數並排序,極其消耗 CPU 與臨時表空間,導致查詢極慢。

優化替代方案

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

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

方案 2:兩次查詢法(通用,性能穩定)

-- 1. 取總行數
SELECT COUNT(*) INTO @total FROM `table`;

-- 2. 應用層生成隨機偏移
SET @offset = FLOOR(RAND() * @total);

-- 3. 取數據
PREPARE stmt FROM 'SELECT * FROM `table` LIMIT ?, 10';
EXECUTE stmt USING @offset;

方案 3:PHP 等應用層隨機主鍵再 IN 查詢

# 應用層取得隨機 ID 列表
$ids = range(1, $maxId); shuffle($ids); $ids = array_slice($ids, 0, 10);
# SQL
SELECT * FROM `table` WHERE id IN (?,?,...);

建議

  • 小表(< 1 萬行)可直接用 ORDER BY RAND()
  • 大表嚴禁在線上直接用 RAND(),採用方案 2 或 3
  • 若業務允許近似隨機,方案 1 性能最佳
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved