在處理海量資料時,我們極少需要一次性取出所有紀錄。無論是實現「每頁 10 筆」的分頁介面,還是只需抽樣前幾筆資料做預覽,MySQL 的 LIMIT 子句都是不可或缺的利器。本文將系統梳理其語法、參數變體與實戰用法。
SELECT * FROM table_name LIMIT [offset,] row_count
-- 或兼容 PostgreSQL 的寫法
SELECT * FROM table_name LIMIT row_count OFFSET offset
-- 等價於 LIMIT 0, 5
SELECT * FROM `table` LIMIT 5;
適用於「最新 5 筆訂單」、「熱門前 10 商品」等場景。
-- 取第 6 至 15 筆(每頁 10 筆,第 2 頁)
SELECT * FROM `table` LIMIT 5, 10;
-- offset=5 表示跳過前 5 筆,row_count=10 表示取 10 筆
分頁公式:LIMIT (page - 1) * pageSize, pageSize
-- 取第 96 筆到最後
SELECT * FROM `table` LIMIT 95, -1;
MySQL 允許 row_count 為 -1 表示「無上限」,配合 OFFSET 可實現「跳過前 N 筆,其餘全取」。
LIMIT 本身不保證順序,務必加上 ORDER BY,否則分頁結果可能因資料插入/刪除而錯亂。
SELECT * FROM `articles` ORDER BY `created_at` DESC LIMIT 10, 20;
當 OFFSET 極大(如 LIMIT 1000000, 10),MySQL 仍需掃描並捨棄前 100 萬行,導致查詢緩慢。
SELECT * FROM t WHERE id > (SELECT id FROM t ORDER BY id LIMIT 1000000, 1) ORDER BY id LIMIT 10;邏輯執行順序:FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT。LIMIT 總是最後執行,這意味著它無法減少前階段的掃描量,只能減少返回給客戶端的行數。
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
LIMIT 10, 5 想取前 10 | 實際取第 11-15 筆 | LIMIT 10 或 LIMIT 0, 10 |
忘記 ORDER BY | 分頁結果不穩定 | 必加 ORDER BY id 等唯一欄位 |
在子查詢中用 LIMIT 但外層無 ORDER BY | 結果不可預期 | 子查詢與外層皆加 ORDER BY |
LIMIT 雖簡單,卻是分頁、抽樣、Top-N 查詢的基石。掌握 單參數、雙參數、負數行數 三種模式,並養成 永遠搭配 ORDER BY 的習慣,即可應對 90% 的業務場景。面對深分頁效能瓶頸時,再引入索引下推、游標分頁等進階優化。