LIMIT 是 MySQL 分頁核心語法,但新手極易誤解參數含義。本文釐清 LIMIT offset, row_count 真實語義,對比常見錯誤理解。
LIMIT [offset,] row_count
# 或
LIMIT row_count OFFSET offset
LIMIT 5, 20 表示**跳過前 5 行**。LIMIT 5, 20 表示**最多返回 20 行**。| 錯誤理解 | 實際行為 | 正確認知 |
|---|---|---|
| 從第 5 行開始,顯示到第 20 行 | 跳過 5 行,取 20 行(第 6~25 行) | offset=跳過行數,row_count=取行數 |
| 顯示第 5 頁,每頁 20 行 | 同上,與頁碼無直接關係 | 頁碼轉換:offset = (page-1)*size |
| LIMIT 20, 5 = LIMIT 5, 20 | 完全不同:前者跳 20 取 5,後者跳 5 取 20 | 參數順序固定,不可交換 |
-- 第 1 頁 (page=1, size=20)
LIMIT 0, 20 -- 或 LIMIT 20 OFFSET 0
-- 第 2 頁 (page=2, size=20)
LIMIT 20, 20 -- offset = (2-1)*20 = 20
-- 第 N 頁
LIMIT (N-1)*size, size
LIMIT 100000, 10 需掃描 100,010 行 → 棄讀 100,000 行 → **極慢**。LIMIT 0, 10 等價於 LIMIT 10,單參數時預設 offset=0。
-- 必須加 ORDER BY 保證分頁穩定性
SELECT * FROM articles ORDER BY created_at DESC LIMIT 10 OFFSET 20;
無 ORDER BY 時,分頁結果順序不確定,翻頁會出現重複/遺漏資料。