首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL LIMIT 子句實現高效分頁查詢:語法詳解與實戰範例

     編輯:MySQL 資料庫相關知識

核心語法

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;

效能關鍵點

  1. 必須配合 ORDER BY:無序分頁結果不可預測。
  2. 深分頁效能陷阱:LIMIT 1000000, 10 會掃描並丟棄前 100 萬行。優化方案:
    • 「延遲關聯」:SELECT * FROM t INNER JOIN (SELECT id FROM t ORDER BY id LIMIT 1000000, 10) tmp USING (id) — 只掃描索引取 ID,再回表。
    • 「游標/Keyset 分頁」:記住上一頁最大 ID,WHERE id > last_id ORDER BY id LIMIT 10 — 適合無限滾動、不需跳頁。
  3. 覆蓋索引:若只查主鍵或索引欄位,可直接在索引樹完成,避免回表。

程式語言整合範例(PHP)

$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 起算 這一鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved