05.26 如何进行夸库数据分页

场景

假设我们采用分表的方案存储了用户注册信息,分表方案为:

表ID = 用户ID % 10

那么我们的用户数据就会存储在10个表中

如果PM来了一个需求,需要根据注册时间分页展示用户注册信息,怎么实现?

解决方案一:分页大致有序

如果一页展示20条数据,那么我们可以在每个分表中查询2条数据,然后在代码中将数据合并到一起。然后排序,返回给前端。

这种方案实现简单,但是2个分页中,数据不一定完全有序。

解决方案二:分页严格有序

查询第一页的时候,我们在每个分表中查询10条记录

SELECT * FROM user_%d ORDER BY `id` DESC LIMIT 0, 10

然后将10个表中的数据进行合并排序,取前10条数据,然后记录下第10条数据的id,一并返回给前段,返回数据大致如下:

{

"total": 100000,

"list": [{}, {}, {}, ...., {}],

"ext": {

"id": 10, //list中最大的id

}

}

查询第二页的时候,前端将ext信息一并传入后端,后端再每个分表查库,查询语句如下:

SELECT * FROM user_%d WHERE `id` > {ext.id} ORDER BY `id` LIMIT 10, 10

查询第三页第四页以此类推

这样的话就能保证查出来的数据严格有序。

解决方案三:搜索引擎

另外的话我们可以把数据导入到搜索引擎,例如elasticsearch,通过elasticsearch完成查询。但是搜索引擎不能保证所有的数据都被查出来,特别是100页之后的数据,这要取决于搜索引擎的排序算法。


分享到:


相關文章: