温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

结果集分页如何实现

发布时间:2026-07-15 15:06:15 来源:亿速云 阅读:89 作者:小樊 栏目:数据库

结果集分页(Pagination)是数据查询中非常常见的需求,核心目标是只取一部分数据而不是全部,以提升性能和用户体验。下面从原理、常见实现方式、示例、注意事项几个方面说明。


一、分页的基本原理

分页通常需要两个参数:

  • pageNum(页码):第几页,从 1 开始
  • pageSize(每页条数):每页显示多少条数据

通过这两个参数,可以计算出数据库查询时的偏移量:

offset = (pageNum - 1) * pageSize

二、常见分页实现方式

✅ 1. 基于 OFFSET + LIMIT(最常用)

SQL 示例(MySQL / PostgreSQL)

SELECT *
FROM orders
ORDER BY id
LIMIT 10 OFFSET 20;

等价于:

SELECT *
FROM orders
ORDER BY id
LIMIT 10 OFFSET (3 - 1) * 10;

Java / MyBatis 示例

int pageNum = 3;
int pageSize = 10;
int offset = (pageNum - 1) * pageSize;

List<Order> list = orderMapper.selectByPage(offset, pageSize);

Mapper:

<select id="selectByPage" resultType="Order">
  SELECT *
  FROM orders
  ORDER BY id
  LIMIT #{offset}, #{pageSize}
</select>

优点

  • 实现简单,通用
  • 适合数据量不大的场景

缺点

  • 数据量大时性能差(OFFSET 越大越慢)
  • 数据频繁变动时,可能出现重复或漏数据

✅ 2. 基于“游标 / 主键”分页(推荐)

适用于大数据量、实时数据

核心思想

不使用 OFFSET,而是用上一页最后一条记录的值作为起点。

SQL 示例

假设按 id 排序:

SELECT *
FROM orders
WHERE id > 12345
ORDER BY id
LIMIT 10;

Java 示例

Long lastId = 12345; // 上一页最后一条的 id
List<Order> list = orderMapper.selectByCursor(lastId, 10);

Mapper:

<select id="selectByCursor" resultType="Order">
  SELECT *
  FROM orders
  WHERE id > #{lastId}
  ORDER BY id
  LIMIT #{pageSize}
</select>

优点

  • 性能稳定,不受数据量影响
  • 适合无限滚动、Feed 流

缺点

  • 必须有有序字段(如 id、时间)
  • 不能直接跳页

✅ 3. 基于时间分页(常见于日志、消息)

SELECT *
FROM logs
WHERE create_time < '2025-01-01 10:00:00'
ORDER BY create_time DESC
LIMIT 10;

适合:

  • 时间线
  • 消息列表
  • 操作日志

三、分页返回结构(推荐)

前端通常需要知道:

  • 当前页数据
  • 是否有下一页
  • 总记录数(可选)

示例分页对象

public class PageResult<T> {
    private List<T> data;
    private int pageNum;
    private int pageSize;
    private long total;
    private int totalPages;
}

四、不同数据库分页语法对比

数据库 分页方式
MySQL LIMIT offset, size
PostgreSQL LIMIT size OFFSET offset
Oracle ROWNUM / FETCH NEXT
SQL Server OFFSET ... FETCH NEXT

五、分页实现建议

小数据量(< 10 万)

  • OFFSET + LIMIT 完全够用

大数据量 / 高并发

  • 使用 主键 / 索引字段游标分页

实时性要求高

  • 避免大 OFFSET
  • 使用 WHERE id > ?

✅ **避免 SELECT ***

  • 只查需要的字段,减少 IO

六、总结一句话

分页 = 控制“取多少条 + 从哪里开始取”
小数据用 LIMIT + OFFSET,大数据用 游标 / 条件分页

如果你有具体场景(如 MyBatis / JPA / Spring Boot / 前端分页 / 千万级数据),我可以给你更贴合的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI