典型分頁查詢片段:
int everyPage = 10; // 每頁顯示條數(前端傳入)
int currentPage = 5; // 目標頁碼(前端傳入)
int startIndex = (currentPage - 1) * everyPage; // 計算起始索引
// SQL: SELECT * FROM table LIMIT startIndex, everyPage
數據庫記錄從 0 開始索引:
| 頁碼 | 記錄索引範圍 | 起始索引公式 | 結束索引 |
|---|---|---|---|
| 1 | 0 ~ 9 | (1-1)*10 = 0 | 9 |
| 2 | 10 ~ 19 | (2-1)*10 = 10 | 19 |
| 3 | 20 ~ 29 | (3-1)*10 = 20 | 29 |
| n | (n-1)*10 ~ n*10-1 | (n-1)*10 | n*10-1 |
(currentPage - 1) * pageSizeLIMIT offset, count 中的 offset)(totalCount + pageSize - 1) / pageSize(向上取整)currentPage < 1 強制置 1;currentPage > totalPages 強制置 totalPages。PreparedStatement 綁定 LIMIT ?, ? 參數。LIMIT 1000000, 10 極慢。優化方案:
SELECT id FROM table ORDER BY id LIMIT offset, pageSize 回表查詳情。WHERE id > lastMaxId ORDER BY id LIMIT pageSize(需唯一遞增鍵)。pageNum、pageSize,後端返回 PageInfo<T> (PageHelper) 或自定義 PageResult 包含 list, total, pages, current。分頁本質是 「跳過前 (page-1) 頁數據,取第 page 頁」。理解索引從 0 開始的零基思維,<(page-1)*pageSize> 就不再是死記公式,而是直觀的邏輯推演。