mysql数据批量插入速度慢

malie0 发布于 2021/12/03 16:02
阅读 606
收藏 2

数据库表已经有几百万条数据,业务处理一次完成时间是9-10秒,主要是数据库写入比较多,原来是一条一条插入,一次业务大概要插入200多条,后来替换成批量插入,一次性把200多条插入,但是业务处理时间依然是要7-8秒,不知道什么原因批量插入无法提升处理速度?

加载中
0
o
ouruyi

不要抓瞎,查执行计划(explain insert),查锁状态(锁冲突可能性比较大),还有就是可能主键设置不合理,要么过长,要么无序(比如使用uuid随机生成的,可能性也比较大);主键无序时,索引树b+tree,频繁调整写入性能肯定差。

b+tree插入示意图:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

顺序插入: 1 2 3 4 5 6 7 8 9

乱序插入:1 5 3 2 7 9 4 8 5

你看下索引树变动过程,就知道乱序插入为什么这么慢了

m
malie0
这是个后台任务,不是前端页面谁都可以操作触发的,应该没有锁的问题。主键是id自增的,没有其他索引
0
mickelfeng
mickelfeng

使用的是什么表引擎,如果没使用事务,myisam插入效率更高。

0
10进制宇宙
10进制宇宙

第一反应当然是硬件配置低所以慢啊。  硬盘,内存,硬指标。

0
dasha
dasha

估计的你的批量插入写法有问题

如果哦使用spring 的批量更新方法,则要单独配置连接参数(百度rewriteBatchedStatements),否则不会有批量插入的效果。

 

m
malie0
恩,这个研究下,当时只是用了mybatisplus提供的批量插入方法,可能在事务这一层上没有优化
0
雷剑华
雷剑华

数据库连接配置里加rewriteBatchedStatements试试。

0
ArchitectureMaster
ArchitectureMaster

写200条记录需要7-8秒代码是存在问题的,可以使用两种方式优化:

1.将mysql connector 使用多线程方式调用。即使用多个线程同时去做插入操作。

1)..先将待写入数据进行内存分页。将数据以线程的个数分成若干个集合。

2),将每个集合分别开启若干线程执行,由单线程依次执行200条,变为多线程并行执行。

3) 如将200条记录分成5个线程,每个数据页40条数据。这样每个线程执行40条写入,并行执行5个线程,速度为提升至少1倍,视你硬件的性能可动态设置线程的个数,性能越强的cpu分配线程越多每条线程执行的插入数据越少。这样写入速度会明显提升。

2.使用sqlbluckcopy,直接内存流表映射写入,本人测试过100万条记录写入的速度也就是7-8秒。mysql原生sdk里有sqlbluckcopy,可直接使用。下面讲方法:

1.首先把List列表需要转换成逗号分隔的字符串写入csv文件。

2.把csv文件路径作为参数写入到sqlbluckcopy对象中!前提是你这个表一定要存在,如果第一次插入必须要先运行create table建表命令!

3.执行sqlbluckcopy对象。

第一种方法加第二种方法结合起来速度会快很多!注意mysql 驱动 有线程不安全的和线程安全的,如果多线程使用线程安全的,否则会出现数据访问异常。如果是单线程操作一定要使用不安全的这样性能是最快的!

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部