SELECT * FROM mytable
ORDER BY afield
LIMIT offset, row_count;
offset:跳過的筆數(從 0 開始),第 M+1 筆對應 offset = M。row_count:要取回的筆數。| 需求 | SQL 範例 | 說明 |
|---|---|---|
| Top 10 | SELECT * FROM t ORDER BY score DESC LIMIT 10 |
LIMIT 10 等同 LIMIT 0, 10 |
| 第 3-7 筆(共 5 筆) | SELECT * FROM t ORDER BY id LIMIT 2, 5 |
跳過前 2 筆,取 5 筆 |
| 第 N 頁,每頁 20 筆 | SELECT * FROM t ORDER BY id LIMIT (N-1)*20, 20 |
應用層計算 offset |
LIMIT 1000000, 20 會掃描 1,000,020 筆再丟棄前 1M 筆,隨著 offset 增大速度線性下降。
SELECT t.*
FROM t
INNER JOIN (SELECT id FROM t ORDER BY id LIMIT 1000000, 20) tmp USING (id)
ORDER BY t.id;
只在索引上掃描 offset,再回表取欄位。id,改用 WHERE id > last_id ORDER BY id LIMIT 20,適合無限滾動、不需跳頁場景。INDEX (sort_col, id) INCLUDE (col1, col2...) 讓查詢完全在索引完成。LIMIT ... OFFSET ... 標準語法,與 LIMIT offset, count 等價。OFFSET ... LIMIT ... 可互換順序。