当前位置: 首页 > news >正文

MySQL按序批量操作大量数据

MySQL按序批量操作大量数据(Java、springboot、mybatisplus、ElasticSearch)

以同步全量MySQL数据到ElasticSearch为例。

核心代码

业务逻辑:

 public boolean syncToElasticsearch() {
        log.info("Starting data synchronization to Elasticsearch.");
        // 获取最大id和最小id
        IdRange idRange = newsMapper.getIdRange();
        log.info("idRange is:{}", JSON.toJSONString(idRange));
        if (idRange == null || idRange.getMinId() <= 0 || idRange.getMaxId() <= 0) {
            log.warn("Invalid id range or no data found in MySQL. Sync process aborted.");
            return false;
        }
        long pageSize = 200L;
        long startId = idRange.getMinId();
        try {
        	// 循环处理所有数据
            while (startId <= idRange.getMaxId()) {
            	// 业务逻辑 可以替换成自己需要的
                log.info("syncToElasticsearch startId:{}", startId);
                List<News> newsList = newsService.getByIdRange(startId, pageSize);
                log.info("syncToElasticsearch newsList size:{}", newsList.size());
                if (CollectionUtils.isEmpty(newsList)) {
                    break;
                }
                newsEsService.bulkUpsertToElasticsearch(getNewsEsDTOList(newsList));

                // 更新startId
                startId = newsList.get(newsList.size() - 1).getId() + 1;
                log.info("Synced {} Newss to Elasticsearch, current id is:{}", newsList.size(), startId);
            }
        } catch (Exception e) {
            log.error("Error occurred during News data synchronization to Elasticsearch.", e);
            return false;
        }
        log.info("Data synchronization to Elasticsearch completed.");
        return true;
    }

mapper:

public interface NewsMapper extends BaseMapper<News> {

    /**
     * 获取最小和最大id值的范围
     *
     * @return
     */
    @Select("SELECT MIN(id) AS minId, MAX(id) AS maxId FROM news")
    IdRange getIdRange();
}

newsService:

    public List<News> getByIdRange(long startId, long pageSize) {
        if (startId <= 0 || pageSize <= 0) {
            return Collections.emptyList();
        }
        return this.list(new LambdaQueryWrapper<News>()
                .ge(News::getId, startId)
                .orderByAsc(News::getId)
                .last("limit " + pageSize));
    }

实体类定义:

@Data
public class IdRange {
    private Long minId;
    private Long maxId;
}

为什么不直接用分页?

页面深度越大查询性能越慢,当表有大量数据时处理后面的数据会很耗时。

相关文章:

  • 使用Matlab实现声音信号处理
  • 23.12.10日总结
  • 大一C语言作业 12.8
  • EasyV易知微助力智慧城市未来趋势发展——数字孪生城市
  • 多汗症的护理重点是什么?
  • 基于Solr的全文检索系统的实现与应用
  • 影视泛目录如何快速提升百度,搜狗权重?
  • selenium/webdriver运行原理与机制
  • 图文教程:从0开始安装stable-diffusion
  • CentOS7 OpenSSL升级到OpenSSH9.5p1
  • Java八股文面试全套真题【含答案】- Spring Security 篇
  • 和鲸科技携手深圳数据交易所,“数据+数据开发者生态”赋能人工智能产业发展
  • 【网络安全】HTTP Slowloris攻击原理解析
  • 数据分析的基本步骤
  • 集成测试如何做?
  • 云原生之深入解析云原生架构的日志监控
  • 【LeetCode刷题笔记(6-1)】【Python】【三数之和】【哈希表】【中等】
  • IDEA debug窗口左边工具栏隐藏与显示
  • 【答案】2023年国赛信息安全管理与评估第三阶段夺旗挑战CTF(网络安全渗透)
  • 【AI】如何准备mac开发vue项目的环境
  • 印度杰纳布河上游两座水电站均已重新开闸
  • 首届上海老年学习课程展将在今年10月举办
  • 深入贯彻中央八项规定精神学习教育中央第七指导组指导督导中国船舶集团见面会召开
  • 上海“随申兑”服务平台有哪些功能?已归集800余个惠企政策
  • 南通市委常委、市委秘书长童剑跨市调任常州市委常委、组织部部长
  • 上海加力提速推进优化营商环境,明确“十大攻坚突破任务”