| 層級 | 優點 | 缺點 | 評價 |
| 客戶端(瀏覽器/JS) | 實作簡單 | 全量資料傳輸,佔用記憶體,體驗差 | ❌ 最不可取 |
| Web 應用層(Java/PHP/Python) | 邏輯集中,可快取 | 仍需從 DB 拉全量資料,網路與 DB 壓力大 | ⚠️ 非最佳 |
| 資料庫層(SQL LIMIT/ROWNUM) | 只傳輸當頁資料,網路最小;DB 可用索引、快取優化 | 每翻頁需查詢 DB | ✅ 推薦 |
結論:每次翻頁只從資料庫撈取當頁大小的資料塊,搭配連線池省去建立連線開銷,效能最優。
主流資料庫分頁 SQL 寫法
MySQL:LIMIT offset, count
SELECT * FROM table_name LIMIT 20, 10; -- 跳過 20 筆,取 10 筆(第 3 頁,頁面 10 筆)
-- 參數:m=起始索引(從 0 開始),n=返回筆數
Oracle:ROWNUM 多層嵌套
Oracle 無直接 LIMIT,需利用 ROWNUM 偽欄位:
-- 高效寫法(推薦)
SELECT * FROM (
SELECT A.*, ROWNUM RN FROM (
SELECT * FROM TABLE_NAME
) A WHERE ROWNUM <= 40
) WHERE RN >= 21;
- 最內層:原始查詢
- 中間層:
WHERE ROWNUM <= 40 讓優化器提前終止掃描(Stopkey 優化)
- 最外層:過濾
RN >= 21 取得第 21~40 筆
為何不建議 BETWEEN 寫法?
-- 低效寫法
SELECT * FROM (
SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A
) WHERE RN BETWEEN 21 AND 40;
CBO 優化器無法將第三層條件下推到最內層,導致全量掃描後再過濾,效能差數倍。
延伸閱讀
下一篇預告
將介紹 Hibernate、Struts 等框架的分頁整合、游標分頁、Keyset 分頁(Seek Method)等進階技術。
- 上一篇文章: phpMyAdmin「配置文件需要短語密碼」錯誤一鍵修復
- 下一篇文章: Windows Server 2008 R2 安裝 MySQL 5.6.22 MSI 版圖文教程:從下載到連線測試
Copyright ©
程式碼之家 All Rights Reserved