数十万条以上的大量数据如何快速插入数据库中
引言:这几天工作这边同事遇到了一个问题,对十五万条数据进行计算,插入数据库的时候耗时很严重,使用了批量插入对十五万条数据插入仍然耗费了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条批量插入一次
本文来自博客园,作者:HumorChen99,转载请注明原文链接:https://www.cnblogs.com/HumorChen/p/18039749