SELECT [欄位] FROM [表] [WHERE ...] [ORDER BY ...] LIMIT [offset,] row_count
LIMIT 5 → 返回前 5 行(相當於 LIMIT 0,5)。LIMIT offset, count
offset:從 0 開始 的跳過行數。第 1 頁 offset=0,第 2 頁 offset=pagesize,以此類推。count:最大返回行數。-- 第 1 頁,每頁 10 筆
SELECT * FROM articles ORDER BY created_at DESC LIMIT 0, 10;
-- 第 2 頁
SELECT * FROM articles ORDER BY created_at DESC LIMIT 10, 10;
-- 第 N 頁(頁碼從 1 起算)
SELECT * FROM articles ORDER BY created_at DESC LIMIT (N-1)*10, 10;
LIMIT 1000000, 10 會掃描並丟棄前 100 萬行。優化方案:
SELECT * FROM t INNER JOIN (SELECT id FROM t ORDER BY id LIMIT 1000000, 10) tmp USING (id) — 只掃描索引取 ID,再回表。WHERE id > last_id ORDER BY id LIMIT 10 — 適合無限滾動、不需跳頁。$page = max(1, (int)$_GET['page']);
$size = 20;
$offset = ($page - 1) * $size;
$sql = "SELECT id, title FROM articles WHERE status=1 ORDER BY id DESC LIMIT ?, ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ii', $offset, $size);
$stmt->execute();
LIMIT 是 MySQL 分頁的基石,語法簡單強大。淺分頁直用無虞;深分頁務必採用「延遲關聯」或「Keyset 分頁」避免全表掃描。永遠記住 offset 從 0 起算 這一鐵律。