java代码下统计大数据的解决方案

594zzb 发布于 2016/02/23 17:00
阅读 5K+
收藏 1

现在我在做一个项目,是由spring mvc和hibernate集合而成的系统。目前有一个这样的需求,每天凌晨需要对当前系统的用户数据进行汇总统计并插入到对应的日终统计表中。这个表有40多个字段,每个字段都需要通过sum方法从其他表中汇总数据出来,但是sum统计的表都是百万级的数据,然后用户表的数据也是百万级别的。目前发现这个统计功能耗时较长,各位有什么好的思路可以提供给我么。

目前我想到的优化是分页获取数据并批次处理以及一些索引的优化。或是有没有什么开源的工具能够支持这种汇总操作,目前这个统计动作会长时间消耗数据库读写,虽然这个统计动作的前提是限制了用户访问系统,但是感觉效率还有待提高,如果后面数据量越来越大的话,很显然可能就需要跑几个小时的统计了。

(因为时间和开发成本问题,不考虑使用 hadoop,尽管是开源的,但是人力投入也是个很大的成本,且项目已经成型了,不支持重构)

加载中
0
开源中国首席公关
开源中国首席公关
首先,你的原有思路在你现有系统中是没问题的,你要考虑的第一点事应该优化的你查询SQL(调整SQL,索引) 个人经验觉得百万级数据 并不会出现你描述的速度问题。
0
z
zh99wj

不知道你的后台数据库用的是什么?oracle?sqlserver?mysql?或者其他?

如果是oracle和sqlserver上我们的做法都是把这个业务统计功能放在数据库本身来做,不建议在应用中实现,通过数据库本身的存储过程、物化视图(oracle)以及定时任务可以很好的完成,前端应该只是去读取最终的统计表中。当然在应用中实现的话也是可以,优点就是代码可以兼容各种数据库,依靠数据库实现的话,各类数据库的脚本代码可能不同,不便于移植。两种方法各有取舍。

另外,如果日终统计表时间数据也很大的话,还要考虑分区表的设计,不能都放在一张表中。

0
卧枝会中田
卧枝会中田

这种按天统计的在传统关系数据库里面 一般都是按天累加统计,避免全表统计 比如你的清单数据 你昨天的结果有了,你只单单汇总一下今天的数据结果在和昨天的结果累加不就是全部的SUM 结果了,前提是一开始就定义好需求

别说上百万,上亿的数据都是这样过来的。

0
尚浩宇
尚浩宇
暂且一张叫原始表,一张汇总表,既然是按天从原始表统计出数据插入到汇总表,那在统计时原始表肯定肯定非当天数据,而且随着时间的延续,非当天数据会越来越多,对统计的干扰会越来越大。一个办法是在每次统计过后把统计的数据迁移到历史表,保证每次统计时原始表只存未统计的当天数据,这样会把统计的外界干扰降到最低,再加上合理的sql语句,除非当天数据上百万,统计性能就不会太差
0
小骏骏
小骏骏

引用来自“尚浩宇”的评论

暂且一张叫原始表,一张汇总表,既然是按天从原始表统计出数据插入到汇总表,那在统计时原始表肯定肯定非当天数据,而且随着时间的延续,非当天数据会越来越多,对统计的干扰会越来越大。一个办法是在每次统计过后把统计的数据迁移到历史表,保证每次统计时原始表只存未统计的当天数据,这样会把统计的外界干扰降到最低,再加上合理的sql语句,除非当天数据上百万,统计性能就不会太差
我也认为这种作法不错,记得性能监控工具Zabbix也是这样的思路,为每天创建不同的表。
尚浩宇
尚浩宇
是呢,不过一般数据丢到历史表,基本就处于存档状态,不会再用了,按月按年分类归档一下就行了
0
5
594zzb
我来结束下话题吧。我是在原有的设计上再加上多线程处理,并对所有的查询语句通过解析获取哪些是走全表扫描的,均加上索引和优化使其不走全表扫描。目前已经大大优化了
0
嘿黑子
嘿黑子

谢谢,提供了很好的思路,我现在也是遇到大表统计的问题

返回顶部
顶部