现在有一个旧表,表中有近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());
}
}