【解决方案】处理大数据量(百万、千万、亿级别)的通用方案

talk is cheap, show me the scheme.

分析数据特征

  1. 统计数据量,少量数据?百万级?千万级?亿级?
  2. 是否含有自增ID
  3. 是否每条数据都有 create_time
  4. 明确WHERE字段是否有索引
  5. 是否包含批量导入的历史数据,即:某个时间点内数据量达到百万级别甚至更高

通用方案

以处理2020年~2021年数据为例。

利用数据的时序性自增ID处理大数据量(百万、千万、亿级别)的通用方案。

false
true
true
false
loop
处理2020-2021年的历史数据
1 查询该数据段的 MAX(id) 及 MIN(id)
2 假设
minId = 1
maxId = 10000000
每次处理2000条数据
maxId >= minId ?
return
3 查询条件
WHERE id >= #{minId} AND id < #{minId + 2000}
AND create_time >= #{strat_time} AND create_time < #{end_time}
hasData ?
处理数据
4 调整minId
minId += 2000
5 查询新的minId
SELECT MIN(id) FROM xxx
WHERE id >= #{minId}
AND create_time >= #{strat_time} AND create_time < #{end_time}

该方案无论对于单节点还是分布式数据库均适用,作者的实践就是基于阿里云DRDS上处理亿级数据。

单节点的数据库,我们可以认为create_time自增ID是正相关的。
即:10001 >= id <= 40000之间的所有数据肯定都是2021-07-07的。
而在分布式数据库中,自增IDcreate_time的关系可能出现如下情况:

database自增ID段idcreate_time
user_db110001~20000100012021-07-07 12:00:00
user_db110001~20000166662021-07-09 12:00:00
user_db220001~30000200012021-07-07 12:00:00
user_db220001~30000266662021-07-08 12:00:00
user_db330001~40000300012021-07-07 12:00:00
user_db330001~40000366662021-07-07 13:00:00

出现这个现象的原因是由于:数据落库的路由算法不均匀或者选择的分库键的值本身就是不均匀的

所以,我们的流程图中第3步WHERE条件是使用id范围create_time范围这两者来进行查询数据的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值