数十万条以上的大量数据如何快速插入数据库中

引言:这几天工作这边同事遇到了一个问题,对十五万条数据进行计算,插入数据库的时候耗时很严重,使用了批量插入对十五万条数据插入仍然耗费了30秒,前面计算也耗费了二十多秒,系统流畅度因此很难堪。经过我的排查发现主要是两个点需要优化。

1)计算的算法冗余,优化前23秒计算完成,优化后0.8秒完成计算(由于业务特殊、保密不方便透露)

2)十五万条数据批量插入数据库时耗费了30秒,优化后3秒。(已达到业务要求范围内,所以不再继续其他细节优化)

批量插入基于的是mybatisplus 的service的insertBatch方法

优化思路:

使用线程池+任务分派器将15万条数据平均分派给线程池中16个线程去处理

存储所有数据的集合为list

线程池使用的FixedThreadPool,因为机器是四核8线程,所以我线程池里放的16个线程。

1、创建线程池

ExecutorService es = Executors.newFixedThreadPool(16);

2、任务分派器

其实就是一个函数,负责分派要插入的数据集合,遍历0到(线程数-1),然后将集合中所有数据平均分配到每一个线程(数据数量%线程数=余数,余下的几个数据的插入工作直接分配给最后一个线程去)

经过分配后每个线程负责1万条数据的插入

16个线程同时跑,由原来的30秒跑完,变成了3秒钟。

如果还需要优化,可以在线程内将自己受到的1万条数据,分10次批量插入或者每1000条批量插入一次

posted @   HumorChen99  阅读(12)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示