You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GraphQL中实现最简分页?(基于星球大战API)

直接跳转到指定分页的GraphQL实现方案

1. 服务端支持offset-based分页(优先考虑)

如果你的GraphQL服务提供offset和limit参数,那就能直接构造请求拿到指定页的数据。比如每页展示5条,第12页对应的偏移量是(12-1)*5=55,请求示例如下:

{
  allPeople(offset: 55, limit: 5) {
    people {
      name
      birthYear
    }
  }
}

这种方式的底层逻辑对应关系型数据库的LIMIT 5 OFFSET 55语句,数据量小的时候性能完全没问题;但数据量达到百万级时,OFFSET会让数据库扫描大量前置数据,性能会明显下降。

2. 小数据集的变通处理

如果服务端只支持cursor分页,而总数据量不大(比如你提到的82条),可以一次性拉取全部数据,在客户端本地完成分页。先请求所有人物数据:

{
  allPeople {
    people {
      name
      birthYear
    }
  }
}

之后在客户端计算第12页的起始索引(12-1)*5=55,直接截取从55到60的5条数据即可,不用多次调用接口。

3. cursor分页的局限性

cursor分页(即keyset分页)本身是为高效滚动分页设计的,它依赖上一页最后一条数据的标识来获取下一页,天生没有“页码”的概念,只知道“从某条数据之后取N条”。如果必须用cursor分页又要跳转到指定页,确实需要多次调用接口,这种方式效率很低,不建议这么做。

底层数据库的关键注意点

你提到关系型数据库没有“按序号排序”的概念,本质是说如果不指定稳定的排序字段,LIMIT ... OFFSET ...的结果可能因为数据变更(比如新增、删除)而出现混乱。所以不管用哪种分页方式,都要指定固定的排序字段(比如id、创建时间),对应的SQL类似:

SELECT name, birth_year FROM people ORDER BY id LIMIT 5 OFFSET 55;

这样才能保证每次分页的结果是一致的。

内容的提问来源于stack exchange,提问作者Stefanie Gauss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:40:10