温馨提示×

温馨提示×

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

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

结果集分页应该怎么实现

发布时间:2026-09-10 10:21:29 来源:亿速云 阅读:107 作者:小樊 栏目:数据库

结果集分页(Pagination)是实现“从大量数据中取某一页数据”的常见需求。下面从原理、常见实现方式、示例、注意事项几个层面系统讲一下。


一、分页的基本原理

分页一般依赖两个参数:

  • page(页码):第几页,从 1 开始
  • pageSize(每页大小):一页多少条

由此可以推导出:

offset = (page - 1) * pageSize
limit  = pageSize

二、常见分页实现方式

✅ 1. 基于数据库的分页(最常用)

(1)MySQL / PostgreSQL

SELECT *
FROM orders
ORDER BY id DESC
LIMIT #{pageSize} OFFSET #{offset};

或 MySQL 写法:

SELECT *
FROM orders
ORDER BY id DESC
LIMIT #{offset}, #{pageSize};

优点

  • 性能好
  • 实现简单

缺点

  • 深度分页(page 很大)时性能下降

(2)深度分页优化(游标分页)

当 OFFSET 很大时:

-- 不推荐
LIMIT 100000, 20;

✅ 推荐:使用游标(Cursor)分页

SELECT *
FROM orders
WHERE id < #{lastId}
ORDER BY id DESC
LIMIT #{pageSize};

适合:

  • 无限滚动
  • 实时数据

✅ 2. 基于内存分页(不推荐大数据)

List<Data> all = queryAll();
List<Data> page = all.subList(offset, offset + pageSize);

缺点

  • 数据量大时内存爆炸
  • 性能极差

✅ 仅适合小数据量(< 1万)


✅ 3. 前后端协作分页(常见 Web 场景)

后端返回结构(推荐)

{
  "page": 1,
  "pageSize": 10,
  "total": 235,
  "list": [ ... ]
}

前端

  • 计算页数
  • 控制“上一页 / 下一页”
  • 避免一次性拉全量

三、带条件的分页示例(MyBatis)

<select id="selectByPage">
  SELECT *
  FROM user
  WHERE status = #{status}
  ORDER BY create_time DESC
  LIMIT #{offset}, #{pageSize}
</select>
int offset = (page - 1) * pageSize;

四、分页常见坑 ⚠️

1️⃣ 忘记 ORDER BY

分页结果会混乱、重复

✅ 必须固定排序字段


2️⃣ 深度分页慢

OFFSET 100000

✅ 用游标分页或覆盖索引


3️⃣ 总数统计性能差

SELECT COUNT(*)

✅ 可缓存 / 近似统计


五、不同场景推荐方案

场景 推荐方式
后台管理 LIMIT + OFFSET
移动端列表 Cursor 分页
大数据量 Elasticsearch / 游标
实时流 游标 / 时间戳

六、一句话总结

分页 = 排序 + 限制数量 + 偏移或游标

如果你用的是 具体技术栈(MySQL / Oracle / ES / Java / Python),我可以给你更针对性的实现方案。

向AI问一下细节

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

AI
助
手