ORDER BY RAND() 是最直觀但最慢的隨機查法:MySQL 會建立臨時表、賦予隨機值、排序後回傳。本文對比 4 種方案在大表下的實測效能,找出最佳平衡點。
| 方案 | 核心邏輯 | 適用條件 |
|---|---|---|
| 1. ORDER BY RAND() | 全表掃描 + 臨時表排序 | 任意表,極慢 |
| 2. MAX/MIN ID + PHP 隨機 | 取 ID 範圍 → PHP 產生隨機數 → WHERE id >= $rand LIMIT 1 | 需連續/近似連續自增 ID |
| 3. RAND() * COUNT(*) + LIMIT | SELECT FLOOR(RAND()*COUNT(*)) AS offset FROM t; SELECT * FROM t LIMIT offset,1; | 任意表,需兩次查詢 |
| 4. 子查詢合併 (MySQL 4.1+) | SELECT * FROM t WHERE id >= (SELECT FLOOR(MAX(id)*RAND()) FROM t) ORDER BY id LIMIT 1; | 需自增 ID,單條 SQL |
ORDER BY RAND()):100% (基準,最慢)LIMIT offset):13% 🏆id 為唯一自增且無大量空洞,否則分布不均。TABLESAMPLE (8.0.18+)。ORDER BY RAND()。