为什么需要分页?
在实际业务中,数据量通常非常大,如果一次性查询全部数据会导致性能下降甚至服务崩溃,因此必须使用分页机制控制数据返回量。
分页类型
Offset 分页
skip + take(传统分页)
Cursor 分页
基于游标的高性能分页
Offset 分页(skip / take)
offset.ts
typescript
const page = 2;
const pageSize = 10;
const users = await prisma.user.findMany({
skip: (page - 1) * pageSize,
take: pageSize
});skip + take 是最常见的分页方式,适合中小数据量场景,但当数据量非常大时性能会下降。
排序(orderBy)
order.ts
typescript
const users = await prisma.user.findMany({
orderBy: {
createdAt: "desc"
}
});multi-order.ts
typescript
const users = await prisma.user.findMany({
orderBy: [
{ createdAt: "desc" },
{ id: "asc" }
]
});Cursor 分页(推荐生产使用)
Cursor 分页通过记录上一条数据的唯一标识(如 id),实现高性能稳定分页,不受数据偏移影响。
cursor.ts
typescript
const users = await prisma.user.findMany({
take: 10,
cursor: {
id: 50
},
skip: 1,
orderBy: {
id: "asc"
}
});cursor 分页不会随着数据量增加而性能下降,是 Feed 流、日志系统的最佳选择。
分页对比
skip vs cursor
skip / take
简单易用,但性能随页数下降
cursor
高性能,适合大数据系统
实际业务场景
使用场景
列表分页
用户列表 / 文章列表 / 商品列表
Feed 流
无限滚动内容流
日志系统
系统日志 / 操作记录
搜索结果
分页展示查询结果
生产级建议
最佳实践
优先 cursor
大数据系统必须使用 cursor
避免深 skip
页数越大越慢
固定排序字段
必须 orderBy 保证稳定性
索引 id / createdAt
分页性能核心
下一步学习
进入下一阶段
事务处理
Prisma Transaction
生产部署优化
连接池 / Serverless
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。