在 web 页面上该如何处理庞大数据的排序?

2019-01-11 12:52:00 +08:00
 skyshy

数据以表格的形式展示,每页 N (比如 N=20 )条数据。数据下发:

  1. 可以一次性下发给页面,然后前端进行分页,
  2. 也可以按每页 20 条,只下发当前页的数据。

数据可以在当前页进行排序,也可以输入数值 (有校验),然后调到数值对应的位置。

普通做法就是以方式 1 的形式,全部下发给页面。用户调整完顺序后,再把全部顺序提交上来。

现在遇到一个问题,面对庞大数据量时,只能下发当前页的数据。此时,如何处理排序?要考虑到跨页排序。

1324 次点击
所在节点    数据库
2 条回复
UIXX
2019-01-11 13:50:38 +08:00
假设是 BS 架构,考量点有两个:数据类型(分为“可作为热数据处理”与“可作为冷数据处理”) 与 数据量(量级)

为方便叙述,这里假定:
小型数据为计算力正常可处理数据量
中型数据为计算力可处理上限
大型数据为计算力尚未达到的量级

1、小型冷数据
你提供的方案 1、2 都可行,对于方案 1,简单点前端接收作暂时性存储,超时范围内不用再进行收发请求,页面直接排序
2、中型冷数据
方案 1 可行,但不好用,容易引起浏览器性能问题,我们最常用的是 2 按页查询,就是很简单的排序范围查询
3、大型冷数据
方案 1 不可行,只能 2,甚至需要一些其他辅助手段,不详展开

对于热数据,我建议评估一下热数据的类型,处理交易状态类数据跟设备状态类数据是完全不一样的。拿交易状态类举例:

1、小型热数据
选择方案 1,尤其是高频交易,有助于缓解后台部分压力
2、中型热数据
方案 2,优化后端数据库操作
3、大型热数据
方案 1、2 都未必可行,可能需要调整存储策略,此时排序本身并不是重点。(这类大部分都不是 BS 架构的东西)

OK,你的问题可以形象化为假设你有十亿条数的记录,如何显示已排序的某连续 20 个(有可能是中间 20 个)
确认你的排序依据是否可以被序号 hash,如果是,那可以直接 hash 得到。如果否:
首先你得明确,在前端无法获得全量数据的情况下,要得到全局排序序列,必须后端排序,前端获取。也就是你前端的工作只是展示,而不是排序。

-----------------------------假设你寻求的是后端的方案-----------------------------------

0、常规优化
索引与多重索引、读写分离、垂直 /水平分库表、查询缓存...blahblahblah

1、业务降维
细化查询范围、拆分数据结构...blahblahblah

2、查询拆分与查询批处理
这个视业务而定,是一次查询整个序列,还是一次查询其中几个改变的...blahblahblah
skyshy
2019-01-13 20:31:21 +08:00
@UIXX 目前遇到的问题是 关于前端排序(不仅仅是升降序,还有调整某些条目之间的顺序),全部下发过去的话,数据量庞大;分页的话,排序也只能在当前页(有多个用户同时调整顺序的情况)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/526003

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX