性能优化
构建分页 API 时如何选择…
为大数据集设计可分页的 API 端点、无限滚动或优化集合查询时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
构建分页 API 时如何选择 offse通用
解决思路
- 根据场景选择分页策略:Offset/Limit 适合小数据集和简单 UI(性能 O(n));Cursor 适合无限滚动和实时场景(O(1));Keyset 适合大数据集(O(1))。
- Offset 分页实现:从 query 读取 page(默认 1)和 limit(默认 20,用 Math.min 限制最大 100),计算 offset = (page - 1) * limit,并行执行数据查询(skip(offset).limit(limit))和总数统计(countDocuments),返回 data 与 pagination(page、limit、total、totalPages = Math.ceil(total / limit))。
- Cursor 分页实现:固定 limit(如 20),从 query 读取 cursor;若有 cursor,则用 _id: { $gt: Buffer.from(cursor, 'base64').toString() } 作为查询条件,否则查询为空对象;查询时取 limit + 1 条以判断是否还有更多,若超过 limit 则 pop 掉多余一条;返回 data 和 nextCursor(有更多时用最后一条的 _id 做 base64 编码,否则为 null)。
- 统一响应格式:返回 data 数组、pagination 对象(page、limit、total、totalPages)以及 links 对象(first、prev、next、last 的 URL)。
- 设置合理的最大 limit(例如 100),绝不允许无限制的 page size。
- 大数据集优先使用 cursor 分页。
- 为排序字段建立索引。
- 尽可能避免 COUNT 查询。
适用边界 · 注意事项
- 小数据集且需要跳页/显示总页数时,cursor 分页不适用,应使用 offset 分页。
- 需要随机访问任意页码(如跳转到第 N 页)时,cursor/keyset 分页不适用。