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

分頁技術原理與實現(一):為什麼要在資料庫層分頁?

     編輯:MySQL 資料庫相關知識

什麼是分頁?

將大量資料切分為固定大小的頁面逐步展示,類似翻閱書籍。常見 UI 模式:頁碼導航、上一頁/下一頁、無限滾動。

分頁的必要性

  • 前端體驗:避免一次渲染成千上萬行導致瀏覽器卡頓。
  • 網絡傳輸:大幅減少回傳資料量,降低頻寬壓力。
  • 伺服器資源:減輕應用層記憶體與 CPU 負擔,防止 OOM 或超時。
  • 資料庫效能:配合索引與 Limit/Offset,僅掃描必要頁面資料。

三層架構下的分頁決策點

請求流向:Browser → Web App → Database

分頁層級優點缺點推薦度
客戶端(JS)實現簡單全量資料傳輸,網絡/記憶體壓力極大❌ 不推薦
應用層邏輯集中、跨資料庫通用仍需全表掃描傳至應用層再過濾,浪費 I/O⚠️ 一般
資料庫層僅回傳目標頁資料,利用索引優化,網絡開銷最小每頁需查詢一次 DB(可用連接池緩解)✅ 最佳

主流資料庫分頁語法對比

MySQL:LIMIT 子句(最簡潔)

SELECT * FROM `table` LIMIT offset, rows;
-- offset 從 0 起算,rows 為頁面大小
-- 第 3 頁,每頁 20 筆:LIMIT 40, 20

Oracle:ROWNUM 雙層嵌套(經典寫法)

SELECT * FROM (
    SELECT A.*, ROWNUM RN FROM (
        SELECT * FROM table_name
    ) A WHERE ROWNUM <= 40
) WHERE RN >= 21;

關鍵優化點:內層 WHERE ROWNUM <= 40 可讓 Oracle 提前終止掃描(STOPKEY),外層再過濾起始行。若改用 BETWEEN 21 AND 40 置於最外層,將導致全表掃描後再過濾,效率大幅下降。

SQL Server:OFFSET FETCH(2012+)

SELECT * FROM table_name
ORDER BY id
OFFSET 40 ROWS FETCH NEXT 20 ROWS ONLY;

分頁查詢的核心原則

  1. WHERE 條件必須包含分區鍵/索引鍵,否則優化器無法修剪掃描範圍。
  2. 深分頁(大 Offset)效能陷阱:LIMIT 1000000, 20 仍需掃描前 100 萬行。解法:WHERE id > last_max_id LIMIT 20(游標式分頁)。
  3. 連接池複用:減少建立連線開銷,提升高併發下的分頁響應。

後續主題預告

  • Struts / Hibernate / JPA 分頁整合
  • 前端分頁元件(jQuery、Vue、React)實現
  • PHP / Python / Java 服務端分頁封裝
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved