← 返回列表

Telegram精准粉引流群 亿级数据量下的分页性能优化:Scroll API与Search After比较

分类:Telegram频道发布于:2026-08-31

telegram搜

当数据规模从百万级增长到亿级,分页就不再只是“跳到第几页”的界面问题,而会直接影响查询延迟、数据库负载、集群稳定性和用户体验。很多系统在数据量较小时使用传统的 from + size 分页,看起来简单直观,但随着页码不断增大,性能下降往往会变得非常明显。

在 Elasticsearch 等搜索系统中,Scroll APISearch After 是处理深分页和大规模数据遍历的两种典型方案。它们解决的问题并不完全相同,正确选型需要结合数据读取目的、实时性要求、排序规则以及集群资源状况进行判断。

📌 一、为什么传统分页在亿级数据下会失效

传统分页通常通过 from 指定偏移量,通过 size 指定返回条数。例如查询第 10000 页时,系统并不能直接定位到目标位置,而是需要在各个分片中先找出前面大量的结果,再丢弃不需要的数据。

如果每页返回 100 条记录,第 10000 页对应的偏移量就是 999900。协调节点和各个分片都可能需要维护大量候选结果,排序、合并和内存管理成本会随页码增长,最终造成响应变慢,甚至触发内存压力和拒绝服务。

GET orders/_search
{
  "from": 999900,
  "size": 100,
  "query": {
    "term": { "status": "paid" }
  },
  "sort": [
    { "created_at": "desc" },
    { "_id": "asc" }
  ]
}

因此,from + size 更适合浅分页,例如前几十页的后台列表,而不适合导出全量数据、构建离线索引或遍历数千万条搜索结果。

⚙️ 二、Scroll API:适合稳定快照式批量读取

Telegram精准粉引流群 Scroll API 的核心思路是先建立一个搜索上下文,随后使用 scroll_id 反复获取下一批结果。它会尽量保持初次搜索时的数据视图,使客户端可以稳定地遍历整个结果集。

这种机制非常适合全量导出、数据迁移、离线计算和批量重建索引。例如一次读取 1000 或 5000 条,处理完成后再请求下一批,可以避免一次性将海量数据加载到应用内存。

POST products/_search?scroll=2m
{
  "size": 1000,
  "query": {
    "match_all": {}
  },
  "sort": ["_doc"]
}

POST _search/scroll
{
  "scroll": "2m",
  "scroll_id": "DnF1ZXJ5VGhlbkZldGNo..."
}

使用 Scroll 时要注意,搜索上下文会占用集群资源,超时时间越长、并发任务越多,资源压力越大。批处理程序应当及时清理 scroll 上下文,并根据节点负载控制并发数。

DELETE _search/scroll
{
  "scroll_id": [
    "DnF1ZXJ5VGhlbkZldGNo..."
  ]
}

Telegram精准粉引流群 🚀 三、Search After:面向实时列表的高效游标分页

Search After 不依赖巨大偏移量,而是利用上一页最后一条数据的排序值,告诉搜索引擎下一次从哪里继续查找。它更接近数据库中的游标分页,不会随着页码增加而线性积累跳过成本。

要让 Search After 稳定工作,排序字段必须具备良好的确定性。实践中通常使用业务排序字段加唯一字段,例如 created_at 加 _id,避免多条记录排序值相同导致重复或漏读。

GET orders/_search
{
  "size": 100,
  "query": {
    "term": { "status": "paid" }
  },
  "sort": [
    { "created_at": "desc" },
    { "_id": "asc" }
  ],
  "search_after": [
    "2025-01-18T10:20:30.000Z",
    "order_8f31"
  ]
}

Search After 的优势是低内存、低跳过成本和更适合在线请求。但它不是传统意义上的任意跳页方案,客户端必须持有上一页的排序游标,用户无法可靠地直接跳到第 1000 页。

电报精准找群黑科技提示:

由于 Telegram 官方搜索对中文支持极差,很多优质的推广、技术和资源群组隐藏极深。如果你正在寻找相关的活跃社群,强烈推荐使用本站首页的 TTSO - Telegram 智能搜索 Bot。作为目前最好用的电报综合搜索导航,只需输入关键词,即可秒级触达数十万个精选 TG 中文群组、资源频道。一键直达,帮你节省 90% 的找群时间!

🔍 四、Scroll API 与 Search After 如何选择

如果任务目标是一次性读取尽可能完整的数据集,例如每天凌晨导出全部订单,Scroll 更适合,因为它提供相对稳定的搜索上下文。若目标是面向用户的搜索列表、消息流或滚动加载,Search After 通常是更合理的选择。

从资源模型看,Scroll 会长期保留上下文,适合可控的短时批处理;Search After 每次请求只携带排序游标,更适合大量并发的在线访问。两者都不能替代合理的索引设计,查询字段、排序字段和分片布局仍然决定了基础性能。

1. 在线列表优先使用 Search After

对于移动端列表、管理后台流水和社交信息流,应将游标保存在客户端或服务端会话中,并限制单次 page size。接口返回 next_cursor 时,最好对游标进行编码或签名,避免客户端篡改查询状态。

2. 离线全量处理使用 Scroll 或 PIT

在较新的 Elasticsearch 版本中,可以结合 Point In Time 与 Search After,实现一致视图下的深度遍历。相比长期 Scroll,上述方式更适合需要精确排序且希望降低上下文管理压力的场景。

Telegram精准粉引流群 3. 不要忽略数据变化带来的影响

没有稳定快照时,如果分页期间发生新增、删除或排序字段更新,Search After 可能出现记录重复或遗漏。对强一致导出任务,应优先使用 PIT 或合适的 Scroll;对实时信息流,则应接受短时间窗口内的数据变化。

🧪 五、亿级数据分页的实践检查清单

第一,确保排序字段已经建立合适的索引映射,并尽量选择低成本、可比较且稳定的字段。第二,避免返回不必要的大字段,使用 _source 过滤降低网络传输和序列化开销。

Telegram精准粉引流群 第三,通过压测观察 P95、P99 延迟、分片 CPU、JVM 堆内存、查询拒绝数和 GC 情况,而不是只看平均响应时间。第四,对导出任务设置超时、重试、断点续传和失败清理机制,避免单个请求失败后重新扫描全部数据。

最后,页大小并非越大越好。可以从 500 或 1000 条开始测试,根据文档大小、网络带宽和消费端处理速度逐步调整;当吞吐量继续提高但延迟和堆内存明显恶化时,就应停止增大批次。

❓ 常见问题解答(FAQ)

Search After 能否实现直接跳页?

通常不能。它依赖上一页的排序值逐页推进,如果产品必须支持任意跳页,应限制最大页码,或设计基于时间范围、分类条件和预计算游标的替代方案。

Scroll 是否适合用户在线浏览?

一般不建议。Scroll 上下文会持续占用资源,且用户浏览过程不可控,更适合后台批处理。在线滚动加载优先考虑 Search After 或 PIT 加 Search After。

排序时为什么一定要加唯一字段?

如果主排序字段相同,分片合并时可能产生不稳定顺序。加入 _id 或其他唯一、不可变字段后,可以形成确定性的排序边界,减少重复和漏读。

亿级数据分页最重要的优化是什么?

核心不是单纯替换一个 API,而是选择正确的读取模型:浅分页使用 from + size,在线连续翻页使用 Search After,离线全量遍历使用 Scroll 或 PIT,并配合稳定排序、合理批次和监控验证。

telegram搜
Telegram搜索入口客服ID@TTSO联系