mysql数据库插入数据缓慢的问题

yueyakk 2017-01-04 02:17:34
需求是这样的:从excel里解析数据,一共9500多条,然后插入数据库的一张表,同时解析这条数据,生成插入其他的表的记录。
其他的表有3张,有的插入3条,有的要插入5条,这个根据解析出来的数量定,如果其中一步出现问题,回滚这一条数据插入的所有相关记录,不影响其他的数据

目前我写了之后,发现9500的数据,在数据库4张表里一共得插入7万多条记录。但是时间得花费大概半小时,现在要求压缩到1分钟,那个大神能提供一点思路啊?
...全文
1346 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yueyakk 2017-01-05
  • 打赏
  • 举报
回复
引用 13 楼 ylovep 的回复:
你这个慢 是单纯的插入数据慢 还是在解析数据的时候各种逻辑验证导致的慢 这2种的问题解决的思路是有所区别的
里面混入了业务逻辑,插入之前还有查询,解析等操作
yueyakk 2017-01-05
  • 打赏
  • 举报
回复
引用 7 楼 ljl434841 的回复:
7万条会慢成这样?应该一分钟内能做完了才对啊。
只插入的话应该是很快的,但是业务逻辑每次里还需要查询已有数据,解析,所以变得很慢,所以想找优化的方法
yuqi_hz 2017-01-05
  • 打赏
  • 举报
回复
这个你得排查清楚吧,是插入速度慢,还是插入之前的读取excel速度慢,还是执行几个表的插入逻辑判断的时候速度慢,一般单纯数据插入不会太慢,除非你设置了很多的索引,触发器,外键
ylovep 2017-01-05
  • 打赏
  • 举报
回复
你这个慢 是单纯的插入数据慢 还是在解析数据的时候各种逻辑验证导致的慢 这2种的问题解决的思路是有所区别的
huleo729 2017-01-05
  • 打赏
  • 举报
回复
可以考虑绕过应用层,使用脚本读取excel文件,然后使用过程去解析和写操作,当然这个要考虑应用场景。
lmkght 2017-01-05
  • 打赏
  • 举报
回复
围观各路大神
tianfang 2017-01-05
  • 打赏
  • 举报
回复
先测试一下插入记录表需要多少时间,这个不需要事务,只是批量提交而已。问问你的DBA,最佳批量值是多少 根据这个,可以估算出你数据库的性能,然后再说继续怎么做 可以写存储过程,也可以由应用服务器处理后写入
crxing13 2017-01-05
  • 打赏
  • 举报
回复
既然有复杂的业务逻辑还是用存储过程吧,excel的数据可以先导入一张临时表。
双子叶 2017-01-04
  • 打赏
  • 举报
回复
读取Excel数据后批量插入数据到表,同时开启Spring job来读取数据库解析数据。将读取数据插入数据库和解析数据分开同时执行,在Spring job开启多线程来解析数据,这样应该能满足需求
清泉流 2017-01-04
  • 打赏
  • 举报
回复
5楼说得对,建议用批量插入,即使回滚这一批数据也比一条一条的插入快得多,应该差十几倍
绝对在乎妮 2017-01-04
  • 打赏
  • 举报
回复
7万条会慢成这样?应该一分钟内能做完了才对啊。
hersing 2017-01-04
  • 打赏
  • 举报
回复
引用 3 楼 yueyakk 的回复:
[quote=引用 2 楼 hersing 的回复:] 楼上已经说了多线程了,还有就是sql优化吧,考虑使用批处理
批处理的话,事务这块怎么办,只要有一条插入失败,是不是这次批处理插入的数据都得回滚了?[/quote] 事务就和平常的没什么区别,只是其中一条出现问题就会全部回滚,这个没办法,但是效率比循环插入快很多
浮云若水 2017-01-04
  • 打赏
  • 举报
回复
批处理是最快的 你不一定要一次插完9000条数据 你可以把这9000条差拆成几批来完成 那一批有报错就回滚哪一批
yueyakk 2017-01-04
  • 打赏
  • 举报
回复
引用 1 楼 shzy1988 的回复:
用多线程来完成这个功能,读取excel表格数据后,开一个线程将数据插入到数据库表中,另外开一个线程来解析这些数据插入另外的表中
但是另外的表存了这个表的id作为关联id,多线程的话这个id就获取不到 了吧
yueyakk 2017-01-04
  • 打赏
  • 举报
回复
引用 2 楼 hersing 的回复:
楼上已经说了多线程了,还有就是sql优化吧,考虑使用批处理
批处理的话,事务这块怎么办,只要有一条插入失败,是不是这次批处理插入的数据都得回滚了?
hersing 2017-01-04
  • 打赏
  • 举报
回复
楼上已经说了多线程了,还有就是sql优化吧,考虑使用批处理
双子叶 2017-01-04
  • 打赏
  • 举报
回复
用多线程来完成这个功能,读取excel表格数据后,开一个线程将数据插入到数据库表中,另外开一个线程来解析这些数据插入另外的表中

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧