新闻详情

新闻详情

首页 / 资讯中心 / 详情

ES深度分页解决方案:性能对比与适用场景分析

发布时间:2026/9/13 4:08:27来源:尧图网络
ES深度分页解决方案:性能对比与适用场景分析
ES深度分页解决方案性能对比与适用场景分析1. 引言在 Elasticsearch 中分页是常见的查询需求。然而当涉及深度分页即获取靠后的数据页时传统的分页方式会遇到严重的性能问题。随着数据量的增加深度分页会导致集群负载显著增加甚至可能影响整个集群的稳定性。本文将详细对比四种分页方案传统分页、Scroll、Search After 和 PIT分析它们的性能特点和适用场景帮助开发者根据实际需求选择最适合的分页策略。2. 传统分页及其局限性Elasticsearch 的传统分页使用from和size参数其中from表示跳过的文档数size表示每页返回的文档数。例如要获取第3页每页10条数据的查询如下GET /your_index/_search { query: { match_all: {} }, from: 20, size: 10 }性能问题当from size的值很大时ES 需要遍历大量文档导致内存消耗和查询时间显著增加ES 需要排序并获取前from size个文档然后丢弃前from个文档这一过程被称为 深度分页问题在大数据量场景下可能导致集群性能下降甚至触发 too many clauses 错误结论传统分页仅适用于浅分页前几页对于深度分页场景表现不佳应避免在生产环境中使用。3. 深度分页方案详解3.1 Scroll 方案Scroll 方案通过创建游标来遍历整个索引类似于数据库中的游标查询。它适合大数据量的全量数据导出场景。POST /your_index/_search?scroll1m { size: 100, query: { match_all: {} } }获取后续数据POST /_search/scroll { scroll: 1m, scroll_id: DXF1ZXJ5QW5kRmV0Y2gBAAAAAAABFZYWlkZAA1YmJjMWU3Zj... }优点能够遍历整个索引不受深度分页限制适合全量数据导出和批量处理场景缺点游标会占用大量内存不能实时获取新索引的数据快照数据实现复杂需要手动管理游标生命周期不支持实时更新数据3.2 Search After 方案Search After 方案基于上一页的最后一条记录的排序值进行分页避免了深度分页的性能问题。GET /your_index/_search { query: { match_all: {} }, size: 10, sort: [ { timestamp: asc }, { _id: asc } ] }获取下一页数据时使用上一页最后一条记录的排序值GET /your_index/_search { query: { match_all: {} }, size: 10, sort: [ { timestamp: asc }, { _id: asc } ], search_after: [1625097600000, 6Yd5eHQ] }优点不受深度分页限制性能稳定实时数据查询能够获取最新数据实现相对简单缺点需要稳定的排序字段且必须包含唯一值在排序数据发生变化时可能导致数据重复或缺失不适合需要排序字段频繁更新的场景3.3 PIT (Point in Time) 方案PIT 是 ES 7.10 引入的特性它创建了一个数据的时间点视图结合 Search After 实现深度分页。首先创建 PITPOST /your_index/_pit?keep_alive1m { body: {} }然后使用 PIT 进行搜索POST /_search { size: 10, query: { match_all: {} }, pit: { id: your_pit_id, keep_alive: 1m }, sort: [ { timestamp: asc }, { _id: asc } ] }获取下一页数据POST /_search { size: 10, query: { match_all : {} }, pit: { id: your_pit_id, keep_alive: 1m }, sort: [ { timestamp: asc }, { _id: asc } ], search_after: [1625097600000, 6Yd5eHQ] }优点提供数据一致性视图不受索引更新影响结合 Search After 的优势实现高效深度分页适合数据可能发生变更的场景缺点需要 ES 7.10 版本支持PIT 会占用额外内存实现相对复杂需要管理 PIT 的生命周期4. 性能对比分析性能对比表格分页方案性能表现内存占用实时性数据一致性适用场景传统分页(from/size)深度分页时性能差低高高浅分页(前几页)Scroll全量数据遍历高效高低(快照)高(快照)全量数据导出、批量处理Search After深度分页性能稳定低高低(数据变更影响)实时数据深度分页PIT深度分页性能稳定中(额外PIT开销)中(一致性视图)高(基于快照)数据变更场景的深度分页分页方案选择流程图浅分页深度分页是否是否开始分页查询分页深度如何使用传统from/size分页是否需要全量导出使用Scroll方案数据是否频繁变更使用PIT方案使用Search After方案5. 最小示例与注意事项Search After 最小示例from elasticsearch import Elasticsearch es Elasticsearch() # 第一次查询 response es.search( indexyour_index, body{ query: {match_all: {}}, size: 10, sort: [ {timestamp: asc}, {_id: asc} ] } ) # 获取下一页 last_sort_values response[hits][hits][-1][sort] response es.search( indexyour_index, body{ query: {match_all: {}}, size: 10, sort: [ {timestamp: asc}, {_id: asc} ], search_after: last_sort_values } )注意事项Search After 注意事项必须包含唯一排序字段避免重复数据如果排序数据发生变化需要重新开始分页适合顺序浏览但不适合随机跳转页面的场景Scroll 注意事项及时关闭不再使用的游标避免资源泄露不适合实时数据查询场景大数据量导出时建议分批处理并定期记录进度PIT 注意事项适当设置 keep_alive避免过早过期或占用过多资源完成分页后及时关闭 PIT在 ES 7.10 版本中使用确保集群支持通用注意事项根据实际场景选择最适合的分页方案考虑数据量和更新频率对性能的影响对于关键业务进行充分的性能测试监控查询性能及时发现潜在问题
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RAG技术解析:大模型时代的智能检索增强方案 2026/9/13 4:56:36

RAG技术解析:大模型时代的智能检索增强方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
开源Web端ER图工具选型:WWW SQL Designer、Adminer与SchemaSpy实战对比 2026/9/13 4:56:36

开源Web端ER图工具选型:WWW SQL Designer、Adminer与SchemaSpy实战对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
给 Codex CLI 装 superpowers:用技能包让 AI 先规划、再写码 2026/9/13 4:56:36

给 Codex CLI 装 superpowers:用技能包让 AI 先规划、再写码

最近在折腾给 Codex CLI 加技能包的事,发现一个叫superpowers的开源项目在开发者圈子里传得很快。它解决的是一个很具体的问题:AI 编程助手越来越强,但经常“有劲没处使”——你让它改个 bug,它不先定位根因就上手;你让…

阅读更多 →
LabVIEW打包EXE报错Error copying files?英文短路径三步搞定 2026/9/13 4:56:36

LabVIEW打包EXE报错Error copying files?英文短路径三步搞定

见过这个报错的朋友,应该都经历过那种“就差最后一脚”的憋屈感。LabVIEW 程序调通了,前面板摆好了,图标换好了,结果在 Build Specification(生成规范) 里点下 Build,等它编译好一阵子&#x…

阅读更多 →
用命令行固化团队AI协作:teamai-cli设计实践与踩坑记录 2026/9/13 4:56:36

用命令行固化团队AI协作:teamai-cli设计实践与踩坑记录

去年下半年团队从 4 个人扩张到 14 个人之后,我发现了一个特别扎眼的现象:代码评审的意见质量方差变得非常大。同一份 PR,有人让 AI 从性能角度挑毛病,有人让 AI 从安全角度找问题,还有人直接把整段代码丢给 AI 问“你…

阅读更多 →
Mastra 项目结构详解:`src/mastra` 目录约定与 CLI 脚手架源码剖析 2026/9/13 4:53:36

Mastra 项目结构详解:`src/mastra` 目录约定与 CLI 脚手架源码剖析

Mastra 项目结构详解:src/mastra 目录约定与 CLI 脚手架源码剖析 【免费下载链接】mastra Mastra is the modern TypeScript framework for AI-powered applications and agents. 项目地址: https://gitcode.com/GitHub_Trending/ma/mastra 本文是 Mastra 入…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞