将十几万条数据插入数据库中,怎么才能高效实现?

PLATINUM_II 2018-08-06 10:14:07
有不到十二万条数据(以后可能还会有更多),需要将这些数据导入到另一张表中,另一张表中可能会存在,也可能不存在。如果存在则更新,不存在则添加,我用mybatis,将第一张表查询到的数据添加到list中,遍历-判断-添加或者同步更新到第二张表。前面几万条数据还好,越往后越慢,尤其是最后一万条,简直一秒动一下。然后用批量操作(mybatis batch)的方式,也是很慢,1000条数据我等了好几分钟都没完成。请各位支招,怎么才能快速将两张表数据同步起来。
...全文
3055 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑色小新 2019-08-28
  • 打赏
  • 举报
回复
https://www.jianshu.com/p/85cbbdddd010这篇文章可以帮你
qq_28057679 2018-08-12
  • 打赏
  • 举报
回复
如果非要总JAVA程序,不要用mybatis的批量操作了。如果你用spring可以用SpringJdbcTemplate。自己用stringbuffer跟for组装批量insert的sql,200个数据一条长sql。。比mybatis的批量操作快多了,毕竟mybatis也要做反射,循环等等工作生成原始sql。
PLATINUM_II 2018-08-09
  • 打赏
  • 举报
回复
现在数据都导进去了,但是要更新一遍的话就会很慢。
啊大1号 2018-08-08
  • 打赏
  • 举报
回复
建议使用多线程
kfm1376822651 2018-08-08
  • 打赏
  • 举报
回复
从MySQL导入到Oracle,CSV导入特别慢,就把表数据导出成sql,二百多万条sql用Java读取特别慢,就用文件分割,分成二十多个文件,每个文件里有一万条sql,然后用mybatis插入,用线程池去处理,每个线程处理一个文件,二百多万条数据几十秒
kfm1376822651 2018-08-08
  • 打赏
  • 举报
回复
我用Oracle插入上百万数据也只要几十秒啊
qq_42910498 2018-08-08
  • 打赏
  • 举报
回复
mysql以前用过 还不错
吉普赛的歌 2018-08-08
  • 打赏
  • 举报
回复
生成一个文本文件使用MySQL的JDBC LOAD DATA LOCAL INFILE。 没有更快的了
https://www.jb51.net/article/33365.htm
yzhfirst1 2018-08-08
  • 打赏
  • 举报
回复
问题是不是由于到后边你新插入的数据太多了导致的,改成先遍历一遍list把已存在的数据先更新,同时从list中删除,剩下的直接插入的数据库中
hr4370913 2018-08-08
  • 打赏
  • 举报
回复
mysql可以de
ITjavaman 2018-08-07
  • 打赏
  • 举报
回复
replace into 原理是关于主键有则更新无则插入,
在主键已经存在的时候,是先删除这一行再插入,操作记录是两次
ITjavaman 2018-08-07
  • 打赏
  • 举报
回复
引用 4 楼 PLATINUM_II 的回复:
[quote=引用 3 楼 ITjavaman 的回复:]
我这边测试了一下,我测试表字段就4个,主键自增,

CREATE TABLE `testuser` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`mobilePhone` varchar(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`password` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `testuser_mobilePhone` (`mobilePhone`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2000001 DEFAULT CHARSET=utf8;

使用replace into 语句

<insert id="test" >
replace into testuser
(mobilePhone,name,password) values
<foreach collection="bookids" item="item" index="index" separator="," >
(#{item},#{item},rand()*10000)
</foreach>

循环插入1000次,一次1000条,
在空表的情况下大概花了48s,
全部存在,也就是全部更新的情况下,花了大概130s


一百万的数据全部更新只要130秒?你的速度为什么这么快,我能看一下你的测试代码吗?这个replace into 我还没用过。[/quote]


dao层

public int test(@Param("bookids")int [] bookids);

执行代码

int [] bookids = null;
for(int i=0;i<1000;i++) {
bookids = new int [1000];
for(int j=0;j<1000;j++) {
bookids[j]=i*1000+j;
}
dao.test(bookids);
}

大概这样子,昨天测完就删了,上面是伪代码
h13438045549 2018-08-07
  • 打赏
  • 举报
回复
使用的是mysql,批量提交我感觉速度也不是很快。我分为1000条提交一次。
XYSYGF 2018-08-07
  • 打赏
  • 举报
回复
有点看不太懂。
c631289494 2018-08-07
  • 打赏
  • 举报
回复
666666666666
small pp 2018-08-07
  • 打赏
  • 举报
回复
S2是多余行政村在此之前
PLATINUM_II 2018-08-07
  • 打赏
  • 举报
回复
谢谢ITjavaman,辛苦了。
ITjavaman 2018-08-07
  • 打赏
  • 举报
回复
如果更新的表索引较多导致效率低,还可以使用insert ON DUPLICATE KEY UPDATE语句
用上面的方式测试了一下,确实更快
济南大飞哥 2018-08-06
  • 打赏
  • 举报
回复
使用多线程,如果是oracle有merge方法;另外就是每个线程别每次提交一条,而是批量提交,有效减少数据库的日志和回滚。
另外oralce还有直接插入,几十万几乎秒级别。
幽饮烛 2018-08-06
  • 打赏
  • 举报
回复
replace into 的原理是先删除后插入,可以改成 update 加 insert 试试。
试试用原始的 JDBC 写法,不用 mybatis 。
加载更多回复(3)

67,512

社区成员

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

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