计算大数据量,频繁操作数据库优化
...大约 2 分钟
计算大数据量,频繁操作数据库优化
1. 背景介绍
我们有个业务场景是需要计算几万个用户的特征,这些用户特征分布在10个表中(不单单是获取某个字段,拿到记录后还需要手动计算)。
最初的版本
- 循环出这几万个用户信息
- 根据用户信息到对应的10张表中查询特征值,并计算
- 将这n个特征值合并
- 保存到数据库中
在数据量小的时候,该方案并没有什么问题,几分钟就完事了。但我们线上环境需要计算几万,甚至几十万的时候,时间成倍增长(我们同步3万个用户,花费了15个小时)。
2. 优化方案1
尝试使用线程池,将3万个数据划分成每100个用户一组添加到线程池。
线程池配置:核心线程20个,最大线程40个
但效果并不好,我们这里的操作主要是频繁操作数据库,这一部分耗费的时间过长。
每个用户查询10张关联表,在保存。
3万个用户,实际查询就需要30万次,保存3万次
3. 优化方案2
关于这种频繁操作数据库,io密集型的操作。我们的优化方式思路:
- 减少请求数量
- 减少请求大小
关于请求数量上,我们查询一个用户的时间和查询100个用户的时间是差不多的,我们把计算放在内存中操作,最后再将这些数据组合就会快很多。
实现思路
- 将3万个用户,每100个划分为一组,添加进线程池
- 一次查询出线程中的100个用户的关联数据
- 分别计算这100个用户特征,然后将特征值放入特征map中(key 为用户id,value对应的特征值)
- 将特征集的n个map,通过用户id查询组合成新特征集
- 批量保存100个特征集
优化后3万个用户同步花费时间为5分钟
赞助