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

PHP + MySQL 分頁查詢實戰:LIMIT 子句完整用法與效能優化

     編輯:MySQL 資料庫相關知識

核心語法


SELECT select_expr FROM table_references
[WHERE where_definition]
[ORDER BY col_name [ASC|DESC]]
LIMIT [offset,] row_count

參數說明

  • offset:起始行偏移量,**從 0 開始**(第 1 行 offset=0)。
  • row_count:最多回傳行數。

常用範例


-- 第 1 頁,每頁 10 筆
SELECT * FROM articles ORDER BY id DESC LIMIT 0, 10;
-- 或
SELECT * FROM articles ORDER BY id DESC LIMIT 10;

-- 第 2 頁
SELECT * FROM articles ORDER BY id DESC LIMIT 10, 10;

-- 第 N 頁(頁碼從 1 起)
SELECT * FROM articles ORDER BY id DESC LIMIT (page-1)*pageSize, pageSize;

PHP 完整分頁範例


query($sql);

// 總筆數(可快取)
$total = $mysqli->query("SELECT COUNT(*) FROM articles")->fetch_row()[0];
$pages = ceil($total / $size);
?>


效能優化關鍵

  1. 避免大 Offset 深分頁:LIMIT 1000000, 10 需掃描 100 萬行再丟棄。
    → 改用 游標分頁(Keyset Pagination):
    WHERE id < last_seen_id ORDER BY id DESC LIMIT 10
  2. 覆蓋索引:INDEX (status, created_at, id) 讓 WHERE status=1 ORDER BY created_at DESC LIMIT ... 走 Using index。
  3. 延遲關聯:只查主鍵 SELECT id FROM ... LIMIT ... 再 JOIN 取明細,減少回表。
  4. 快取總數:COUNT(*) 在大表慢,用 Redis 快取或近似值。

常見陷阱

  • LIMIT 後不可直接跟變數(需確保整數,防注入)。
  • OFFSET 為負數會報錯。
  • 無 ORDER BY 時結果順序不穩定,分頁會亂序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved