将旧表中5000w数据放到新建的100张表中

7 篇文章 0 订阅
5 篇文章 0 订阅

现在有一个旧表,表中有近5000w条数据,想要将他们按照编号的最后两位来进行转移到相应的表中,现在表有100张,分别为:00,01,02.。。。99
.。。。。。明白需求后就上代码了,
首先遇到的一个问题就是查询。。5000w条数据如何去查询,若是按照普通的查询那么时间是一个问题,这个时候我们就用到了分批次查询,分批次查询的方法有几种,我用到的是分页分批查询。

进行分页分批查询

 int page=1;//开始页
int limit=15000;//每页查询条数
int start=limit*(page-1);
//countTotal() 中的count(*)在mysql 5.6后并不会造成全表扫描
int endPage=(approveMapper.countTotal()%limit==0?approveMapper.countTotal()/limit:(approveMapper.countTotal()/limit)+1);
for(int i=0;i<endPage;i++) {
    List<Approve> approves = approveMapper.selectLoanReqNo(start, limit);
 //这里的代码在下面一节数据迁移中
 page++;
}

mapper

//查询总条数
@Select("select count(1) from xxx_request")
int countTotal();

//分页分批查询
@Select("select * from xxx_request limit #{start},#{limit}")
List<Approve> selectLoanReqNo(@Param("start") int start, @Param("limit") int limit);

//批量插入相应的表中
void insertData(@Param("tableName") String tableName, @Param("list1") List<Approve> list1);

mapper xml

<insert id="insertData" parameterType="java.util.List">
    insert into ${tableName} values
    <foreach collection="list1" index="index" item="item" separator=",">
        (#{item.属性1},#{item.属性2}.。。。。。)
    </foreach>
</insert>

迁移数据

if (!approves.isEmpty()) {
    //根据借据号最后两位进行分组
    Map<String, List<Approve>> collect = approves.stream().collect(Collectors.groupingBy(e -> {
        String endString = e.getReqNo().substring(e.getReqNo().length() - 2);
        return endString;
    }));
    for (Map.Entry<String, List<Approve>> entry : collect.entrySet()) {
        String tableName = "xxx_request_" + entry.getKey();
        //批量插入数据库
        approveMapper.insertData(tableName, entry.getValue());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值