分页问题
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并不适用于有跳页的情景,太消耗资源了,所以不建议使用。