结果集分页(Pagination)是实现“从大量数据中取某一页数据”的常见需求。下面从原理、常见实现方式、示例、注意事项几个层面系统讲一下。
分页一般依赖两个参数:
由此可以推导出:
offset = (page - 1) * pageSize
limit = pageSize
SELECT *
FROM orders
ORDER BY id DESC
LIMIT #{pageSize} OFFSET #{offset};
或 MySQL 写法:
SELECT *
FROM orders
ORDER BY id DESC
LIMIT #{offset}, #{pageSize};
优点
缺点
当 OFFSET 很大时:
-- 不推荐
LIMIT 100000, 20;
✅ 推荐:使用游标(Cursor)分页
SELECT *
FROM orders
WHERE id < #{lastId}
ORDER BY id DESC
LIMIT #{pageSize};
适合:
List<Data> all = queryAll();
List<Data> page = all.subList(offset, offset + pageSize);
缺点
✅ 仅适合小数据量(< 1万)
{
"page": 1,
"pageSize": 10,
"total": 235,
"list": [ ... ]
}
<select id="selectByPage">
SELECT *
FROM user
WHERE status = #{status}
ORDER BY create_time DESC
LIMIT #{offset}, #{pageSize}
</select>
int offset = (page - 1) * pageSize;
分页结果会混乱、重复
✅ 必须固定排序字段
OFFSET 100000
✅ 用游标分页或覆盖索引
SELECT COUNT(*)
✅ 可缓存 / 近似统计
| 场景 | 推荐方式 |
|---|---|
| 后台管理 | LIMIT + OFFSET |
| 移动端列表 | Cursor 分页 |
| 大数据量 | Elasticsearch / 游标 |
| 实时流 | 游标 / 时间戳 |
分页 = 排序 + 限制数量 + 偏移或游标
如果你用的是 具体技术栈(MySQL / Oracle / ES / Java / Python),我可以给你更针对性的实现方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。