大家好,欢迎来到IT知识分享网。
1.业务场景
大约70几万条MongoDB数据迁移到mysql
刚开始是先查询总数,然后再根据总数进行分页查询,如果数据量特别大,查询到后面的页会越来越慢,此种情况,可以根据实际情况,对数据进行排序查询后,查询条件加上大于上页最后一条数据的排序键来提升速度。
Date beginTime = DateUtil.parse(startDate + " 00:00:00", DateUtil.PATTERN_DATETIME);
Date endTime = DateUtil.parse(endDate + " 23:59:59", DateUtil.PATTERN_DATETIME);
//查询指定时间之间的数据
Query query = new Query().addCriteria(Criteria.where("createTime").gte(beginTime).lte(endTime));
query.with(new Sort(Sort.Direction.DESC,"createTime"));
long amount = mongoTemplate.count(query, XXEntity.class);
int page = (int)amount / PAGE_LIMIT;
if(amount % PAGE_LIMIT > 0 ){
//余数不为0时,要加1
page += 1;
}
query.limit(PAGE_LIMIT);
for(int i =0; i < page;i++){
query.skip(i * PAGE_LIMIT);
List<XXEntity> entities = mongoTemplate.find(query, XXEntity.class);
}
这里,我们使用mongo查询中更友好的查询方式:游标,来实现在mongo中对海量数据的查询。
Query query=new Query();
query.addCriteria(
Criteria.where("status").is(2)
.and("isDeleted").is(0));
//指定查询集合
MongoCursor<Document> cursor = mongoTemplate.getCollection("t_xxxxxxx")
//组装查询条件
.find(query.getQueryObject())
//组装排序方式(非必须,可不设置)
.sort(query.getSortObject())
//设置游标查询不超时
.noCursorTimeout(true)
//设置批量从数据库中获取的数据量
.batchSize(2000)
.iterator();
while (cursor.hasNext()){
Document next = cursor.next();
next.get("_id")
}
这种方式70w条数据处理不到10分钟。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14450.html