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分钟。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐