-- 兩參數:offset, row_count
SELECT * FROM table LIMIT 6, 10; -- 第 7-16 行(offset 從 0 開始)
-- 單參數:row_count(等同 LIMIT 0, n)
SELECT * FROM table LIMIT 5; -- 前 5 行
SELECT * FROM table LIMIT 0, 5; -- 等價寫法
MySQL 執行 LIMIT 10000, 10 時:
掃描成本與 Offset 成正比,深分頁效能線性惡化。
SELECT * FROM cyclopedia
WHERE ID >= (
SELECT ID FROM cyclopedia ORDER BY ID LIMIT 90000, 1
) LIMIT 100;
實測:0.19s vs 原始 8.88s(快 46 倍)。
進階簡化(去除多餘 MAX):
SELECT * FROM cyclopedia
WHERE ID >= (
SELECT ID FROM cyclopedia LIMIT 90000, 1
) LIMIT 100;
SELECT * FROM cyclopedia
WHERE ID > (
SELECT MAX(ID) FROM (
SELECT ID FROM cyclopedia ORDER BY ID LIMIT 90001
) AS tmp
) LIMIT 100;
實測 0.23s,略慢於策略一。策略一更簡潔高效。
-- 第一頁
SELECT * FROM cyclopedia ORDER BY ID LIMIT 100;
-- 記住最後 ID = 90000
-- 下一頁
SELECT * FROM cyclopedia WHERE ID > 90000 ORDER BY ID LIMIT 100;
優勢:純索引範圍掃描,無子查詢、無排序、效能恆定極快。
實測:1 row in set (8.88) sec —— 觸發全表掃描捨棄機制,極慢。
核心教訓:SELECT * 強制回表,配合大 Offset 掃描,雙重效能殺手。
| 特性 | MS-SQL TOP | MySQL LIMIT |
|---|---|---|
| 語法 | SELECT TOP 100 * FROM t |
SELECT * FROM t LIMIT 100 |
| 分頁支援 | 2012+ OFFSET ... FETCH,早期需 ROW_NUMBER() 視窗函數 |
原生 LIMIT offset, count |
| 深分頁效能 | 差(需掃描前 N 行) | 差(同樣機制) |
| 優化手段 | 同樣需「記住上頁最大 ID」或索引定位 | 同樣優化策略適用 |
| 測試對比 | TOP 90000 390ms |
LIMIT 90000 360ms |
MySQL LIMIT 在大 Offset 掃描上略優於早期 SQL Server TOP,但本質相同,深分頁必須優化。
LIMIT。WHERE id >= (SELECT id ... LIMIT offset, 1) LIMIT pageSize。WHERE id > last_id LIMIT pageSize(最快、最穩定)。SELECT *,只查必要欄位,配合覆蓋索引避免回表。