分布式架构关于数据分页问题

分页问题

100个数据,一页显示20个,有5页,这个数据量在常规的单台mysql 库中还是比较容易出结果的,比较常见的做法就是:

  • limit 20,40
  • a> 20 limit 20

但是对于分布式系统来说,数据都是存在多个系统里,那么分页就不是这么简单处理的,典型的elasticsearch、分布式数据库分页,本文将通过elasticsearch的分页来了解分布式环境下的分页方案。

分布式数据分页:全局分页

100个数据负载均衡之后分到了5个库里,然后如何通过对5个数据排序就很难搞了,可能需要从每一个库里找到20个数据,排序然后再截取数据返回,可是如果数据量比较大,比如:我们每次要查10000个数据,第一页还很简单,越到后面查询的数据就越多,但只是为了10000条数据,每一个库都要给10000条数据返回总结点,总节点再排序得到10000条全局的数据。

分布式系统分页解决方法

  • 浅分页 from + size
    这个跟数据库的limit功能一样的,不过不适合深分页。

  • 深分页search after
    search_after 分页的方式是根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。但是需要注意,因为每一页的数据依赖于上一页最后一条数据,所以无法跳页请求。为了找到每一页最后一条数据,每个文档必须有一个全局唯一值,官方推荐使用 _uid 作为全局唯一值,其实使用业务层的 id 也可以。

  • scroll 游标轮询
    scroll 类似于sql中的cursor,使用scroll,每次只能获取一页的内容,然后会返回一个scroll_id。根据返回的这个scroll_id可以不断地获取下一页的内容,所以scroll并不适用于有跳页的情景,太消耗资源了,所以不建议使用。

参考博客

分布式数据库的分页方案
业界难题-“跨库分页”的四种方案
ES分页看这篇就够了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于千万级精确分页查询,Elasticsearch提供了一些有效的方法。下面是一些建议: 1. 使用 Scroll API:在传统的分页方式中,每次查询都会重新计算结果,这对于千万级的数据集来说是非常耗时的。而使用Scroll API,可以一次性获取所有结果,并使用游标来逐步滚动获取数据。这种方式避免了重复计算,提高了查询效率。 2. 使用 Search After:Search After是一种基于游标的分页方式,可以避免深度分页(深度分页指的是用户请求的页数非常大,超过了Elasticsearch默认设置的10000的最大查询结果数)。使用Search After可以在每次查询中通过传递上一次查询结果的最后一个排序值来获取下一页的结果。 3. 优化查询性能:对于千万级数据集,查询性能的优化非常重要。可以考虑以下几点来提高查询性能: - 使用合适的索引(包括字段类型、分词器和分析器)和映射设置。 - 避免在查询中执行复杂的聚合操作。 - 如果可能,尽量使用过滤器而不是查询来限制结果集。 - 如果需要排序,可以考虑在索引时预先排序或使用排序脚本来提高查询性能。 4. 使用分片优化:分布式架构中,数据会分布在多个分片上。可以通过合理设置分片数、副本数和路由策略来优化查询性能。请注意,过多的分片数可能会导致性能下降,因此需要权衡利弊。 请根据具体情况选择适合的方法进行千万级精确分页查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值