Java处理上千万数据量的数据

前言

最近项目中有一个需求,需要从一千多万的原始数据中,每条数据都是用户的办事数据,处理出事项与事项之间的关系

思路一

程序一

把数据表增加索引,提高查询效率

把数据排好序,测试查询速度 

 

 使用临时表保存排序好的数据

int size = groupByList.size();
        int time = size/100000;//提交次数
        // 开启事务
        String sql111 = "START TRANSACTION;";
        runner.execute(sql111);
        for (int i = 1; i <= time; i++) {
            StringBuilder insertSql1 = new StringBuilder("insert into jzts_item_temp (SPSXBH,HZSXBH,SBSJ,SQRZJHM) values ");
            for (int j = (i-1)*100000; j < i * 100000; j++) {
                insertSql1.append("(");
                insertSql1.append("'").append((String) groupByList.get(j).get("SPSXBH")).append("'");
                insertSql1.append(",");
                insertSql1.append("'").append((String) groupByList.get(j).get("HZSXBH")).append("'");
                insertSql1.append(",");
                insertSql1.append("'").append((Timestamp) groupByList.get(j).get("SBSJ")).append("'");
                insertSql1.append(",");
                insertSql1.append("'").append((String) groupByList.get(j).get("SQRZJHM")).append("'");
                insertSql1.append(")");
                if(j != i * 100000 -1){
                    insertSql1.append(",");
                }
            }
            runner.update(insertSql1.toString());
            long end1 = System.currentTimeMillis();
            logger.info("已处理{}0w条数据,花费 {} ms", i, (end1 - start));
        }
        // 提交事务
        String commitSql = "commit;";
        runner.execute(commitSql);

经过测试,处理插入100w条数据大概413秒,7分钟

理想情况下,推测1000w条数据大概要1个多小时能跑完。

程序二

4.在临时表的“事项编号”建索引,遍历临时表,根据事项分类,一个事项一个表,大概2000+个表,分别把包含后置事项的记录插入2000+个表中(看到这2000+个表也许解决崩溃了)

跑100w条数据大概210秒

QueryRunner runner = QueryRunnerUtils.getRunner("basicdb");
        QueryRunner runnerB = QueryRunnerUtils.getRunner("thing2thing");
        String sql = "select DISTINCT SPSXBH from jzts_item_temp";
        Set<String> set = new HashSet<>(1000);
        runner.query(sql,rs -> {
            while (rs.next()){
                set.add(rs.getString("SPSXBH"));
            }
            return null;
        });

        logger.info("所有事项为:{}",set);

//        set.forEach(s -> {
        for (String s : set) {

            if(!"1100236002".equals(s)){
                continue;
            }
            s = s.replaceAll(" ","");
            StringBuilder checkSql = new StringBuilder();
            checkSql.append("DROP TABLE IF EXISTS ").append("item_").append(s.replaceAll("-","_")).append(";"
  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值