將大量資料切分為固定大小的頁面逐步展示,類似翻閱書籍。常見 UI 模式:頁碼導航、上一頁/下一頁、無限滾動。
請求流向:Browser → Web App → Database
| 分頁層級 | 優點 | 缺點 | 推薦度 |
|---|---|---|---|
| 客戶端(JS) | 實現簡單 | 全量資料傳輸,網絡/記憶體壓力極大 | ❌ 不推薦 |
| 應用層 | 邏輯集中、跨資料庫通用 | 仍需全表掃描傳至應用層再過濾,浪費 I/O | ⚠️ 一般 |
| 資料庫層 | 僅回傳目標頁資料,利用索引優化,網絡開銷最小 | 每頁需查詢一次 DB(可用連接池緩解) | ✅ 最佳 |
SELECT * FROM `table` LIMIT offset, rows; -- offset 從 0 起算,rows 為頁面大小 -- 第 3 頁,每頁 20 筆:LIMIT 40, 20
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 置於最外層,將導致全表掃描後再過濾,效率大幅下降。
SELECT * FROM table_name ORDER BY id OFFSET 40 ROWS FETCH NEXT 20 ROWS ONLY;
LIMIT 1000000, 20 仍需掃描前 100 萬行。解法:WHERE id > last_max_id LIMIT 20(游標式分頁)。