结果集分页(Pagination)是数据查询中非常常见的需求,核心目标是只取一部分数据而不是全部,以提升性能和用户体验。下面从原理、常见实现方式、示例、注意事项几个方面说明。
分页通常需要两个参数:
通过这两个参数,可以计算出数据库查询时的偏移量:
offset = (pageNum - 1) * pageSize
SELECT *
FROM orders
ORDER BY id
LIMIT 10 OFFSET 20;
等价于:
SELECT *
FROM orders
ORDER BY id
LIMIT 10 OFFSET (3 - 1) * 10;
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,而是用上一页最后一条记录的值作为起点。
假设按 id 排序:
SELECT *
FROM orders
WHERE id > 12345
ORDER BY id
LIMIT 10;
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>
✅ 优点
❌ 缺点
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 万)
✅ 大数据量 / 高并发
✅ 实时性要求高
WHERE id > ?✅ **避免 SELECT ***
分页 = 控制“取多少条 + 从哪里开始取”
小数据用LIMIT + OFFSET,大数据用 游标 / 条件分页。
如果你有具体场景(如 MyBatis / JPA / Spring Boot / 前端分页 / 千万级数据),我可以给你更贴合的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。