场景
假设我们采用分表的方案存储了用户注册信息,分表方案为:
表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页之后的数据,这要取决于搜索引擎的排序算法。
閱讀更多 蝸牛zzZ 的文章
關鍵字: ElasticSearch 分页 搜索引擎