首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

數據庫分頁查詢全解析:SQL 語句、Java 實現與分頁模式

     編輯:程式設計疑難解答

主流數據庫分頁 SQL

數據庫語法示例 (第 2 頁,每頁 10 條)
MySQL / PostgreSQL / SQLite LIMIT offset, count SELECT * FROM t LIMIT 10, 10
Oracle 12c+ OFFSET ... ROWS FETCH NEXT ... ROWS ONLY SELECT * FROM t OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
SQL Server 2012+ OFFSET ... ROWS FETCH NEXT ... ROWS ONLY 同 Oracle
SQL Server 2008/2005 ROW_NUMBER() OVER (ORDER BY ...) + 子查詢 SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn FROM t) tmp WHERE rn BETWEEN 11 AND 20
DB2 FETCH FIRST ... ROWS ONLY + 子查詢 類似 SQL Server 2008

Java 代碼實現模式

1. 手寫分頁工具類

public class PageHelper {
    public static String buildPageSql(String sql, int pageNum, int pageSize, String dialect) {
        switch (dialect) {
            case "mysql": return sql + " LIMIT " + (pageNum-1)*pageSize + "," + pageSize;
            case "oracle": return "SELECT * FROM (" + sql + ") WHERE rownum ..."; // 略
            // ...
        }
    }
}

2. MyBatis 分頁插件

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.3.3</version>
</dependency>

// 使用
PageHelper.startPage(2, 10);
List list = userMapper.selectAll(); // 自動拼接 LIMIT
PageInfo page = new PageInfo<>(list); // 獲取總數、總頁數等

3. Spring Data JPA

Pageable pageable = PageRequest.of(1, 10, Sort.by("id").descending());
Page page = userRepository.findAll(pageable);

分頁模式分類

模式特點優點缺點
偏移分頁LIMIT/OFFSET簡單、支持跳頁深翻頁性能差(掃描前 N 行)
游標/Keyset 分頁WHERE id > lastId ORDER BY id LIMIT N性能極佳、無深翻頁問題不支持隨機跳頁、需唯一排序鍵
滾動加載前端無限滾動調用游標分頁用戶體驗好無法 SEO、無法跳頁

性能優化建議

  • 大數據量(百萬級+)強制使用游標分頁,禁用 OFFSET。
  • 覆蓋索引包含 ORDER BY 列,避免回表。
  • 總數統計 COUNT(*) 緩存或異步估算。
  • 禁止 SELECT *,只查需要的列。

選對分頁模式,性能提升百倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved