论坛首页 Java企业应用论坛

怎样处理系统中每日大量数据上传问题及报表统计分析缓慢问题

浏览 3501 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-22  
这边系统大致情况:
    外业人员每人一个手持终端,大约在线同时有200多号人,然后每一个终端隔一段时间就给服务端发送当前位置数据。每日数据量大概有30w条数据。
    现在做法数据全部插入到了一张表中,造成这个表数据量很大,目前这边做法这个表只保留一个季度的数据,别的备份到备份表中。但是还是不能解决问题,当这个表有几千万条数据时,做统计分析功能很慢,因为还要关联别的表,group这种常用。
   我的一点思路,服务端首先过滤下终端提交上来的数据,当提交的数据在一个容差范围内,过滤这种无用的数据,还有就是在服务端做一点缓冲,当够n条时再请求数据库向数据库提交,目前做法是来一条就数据库提交一条。
   关于存这个大量点的表如何来拆分,处理很让人头疼。而客户需要的报表统计分析功能又复杂。大家帮忙出出主意。
   发表时间:2012-07-22  
将一个表中的数据放到两个或多个表中,这些表的结构要求一样,策略是按月归类,如第一个月的放第一张表,第二人月的放第二张表中。
0 请登录后投票
   发表时间:2012-07-22   最后修改:2012-07-22
zhmiao 写道
这边系统大致情况:
    外业人员每人一个手持终端,大约在线同时有200多号人,然后每一个终端隔一段时间就给服务端发送当前位置数据。每日数据量大概有30w条数据。
    现在做法数据全部插入到了一张表中,造成这个表数据量很大,目前这边做法这个表只保留一个季度的数据,别的备份到备份表中。但是还是不能解决问题,当这个表有几千万条数据时,做统计分析功能很慢,因为还要关联别的表,group这种常用。
   我的一点思路,服务端首先过滤下终端提交上来的数据,当提交的数据在一个容差范围内,过滤这种无用的数据,还有就是在服务端做一点缓冲,当够n条时再请求数据库向数据库提交,目前做法是来一条就数据库提交一条。
   关于存这个大量点的表如何来拆分,处理很让人头疼。而客户需要的报表统计分析功能又复杂。大家帮忙出出主意。


看楼主的描述,系统性能瓶颈在统计查询,而不是数据插入,楼主采用延迟批量插入的方案不但解决不了真正的问题,还会造成数据丢失
(客户端数据已经提交到服务器,但是未满N条,如果此时发生服务器故障,则客户端已经提交的数据就永远不可能插入数据库)

除了楼上建议的按月分表方案以外,还可以做以下的改进:
1.给数据表增加一个按时间的索引是少不了的,时间字段的类型最好是比较短的,
  对于MySQL,timestamp的存储效率优于datetime
2.如果是Oracle数据库,可以使用物化视图
3.另一个比较高效的办法是分段统计,对平台没要求,对编程有要求,具体做法如下:
  3.1 按用户统计精度的"下一个精度",预先统计.比如用户的统计精度是按天,则事先按小时统计.假如用户统计精度是小时,则事先按分钟统计,依此类推.
  3.2 预先统计是异步任务,每隔一段时间运行一次.
  3.3 用户发起查询时,先检查哪些"预先统计"的结果可用,余下的实时统计(这部分的数据量已经很小了)
  分段统计的方案对平台要求很低,就是编程的时候麻烦点
0 请登录后投票
   发表时间:2012-07-23  
1.上传问题解决办法:可以将你的数据以文件的形式传入到服务器,不一定要马上入库。等到数据库清闲的时候入库。入库够这些文件最好做上备份,防止丢失。这样基本上可以解决上传的压力。
2.统计分析的问题:1.建议每一个月建一张表。如果数据量大的系统这个是必须得。
                  2.在每天上建上分区。这样统计分析的时候可以根据天来分析。
                  3.如果数据量还是大的话,可以考虑将几个客服端的数据分组,分成几个组建立几个相应的数据库用户,这样的话数据既不冲突又可以解决数据量的问题,此方法配上上面两种方法肯定可以解决上面的问题。

以上经验是我在做联通bss 计费系统的时候总结给您的经验。


不清楚可以问我。乐意效劳
0 请登录后投票
   发表时间:2012-08-07  
可以采用分表形式,你可以根据id%30进行分表,这样一来就分为30张表了,你一张表最多一天就1w条数据1w条数据对数据库查询来说是小意思,再加上按照月份分表,都可以解决问题的,如果数据修改不是过于频繁,可以加上缓存
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics