批量插入指的是:
同一事务内,同一个 PreparedStatement,for 循环,反复赋值提交,最终提交一次事务
多行插入指的是:
拼接类似于下面这种语句 insert into table values(x,y,z),(x,y,z),(x,y,z);
如果需要插入大量数据,使用哪种方式更好呢?
数据库使用 Mysql
1
yitingbai 2021-06-25 13:29:07 +08:00
个人觉得多行插入速度更快些
|
2
wolfie 2021-06-25 13:54:55 +08:00
java.sql.Statement#executeBatch
|
3
redcoffeecat 2021-06-25 14:04:49 +08:00
差不多
|
4
kiracyan 2021-06-25 14:12:19 +08:00
写个代码插个一万行就知道了
|
5
cnoder 2021-06-25 14:13:21 +08:00
多行插入注意下数据上限~有的可能有参数数量上限或者考虑 binlog-row 一时间写入太多~。。但我还是喜欢多行插入
|
6
timethinker 2021-06-25 14:14:10 +08:00
如果是 MySQL 的话,我以前测试过,在大批量数据插入情况下(数据迁移),关闭以下这些选项插入更快:
关闭自动提交模式 关闭索引 关闭外键检查 至于 INSERT 语句一次插入一条还是多条,区别在于网络 IO 耗时,在内部速度应该都是一样的,不过返回来想一下,这种合并插入语句更难以维护和编写,除非特殊情况否则不建议这么做。 详见: https://dev.mysql.com/doc/refman/5.7/en/optimizing-innodb-bulk-data-loading.html |
7
cnoder 2021-06-25 14:14:30 +08:00
看错了 打扰了,当我没说
|
8
mcoo1997 2021-06-25 14:32:21 +08:00
批量插入 写起来爽就完事了
|
9
simonlu9 2021-06-25 14:53:13 +08:00 2
insert into table values(x,y,z),(x,y,z),(x,y,z); 这个是原子性的,看二进制日志就是开启了一个事务,你试试中间有一条插入失败,全部都会回滚
|
10
cheng6563 2021-06-25 15:11:59 +08:00
多行插入快得多,但不要一次太多行。
在 Java 里,批量插入不会提升太多性能,除非你加上 rewriteBatchedStatements=true 参数,这样连接驱动会把你的批量插入转成多行插入。 |
11
xupefei 2021-06-25 16:43:43 +08:00 via iPhone
这两个方案效率一样。
|
12
bthulu 2021-06-25 17:03:45 +08:00
效率一样的, 只不过批量插入兼容多种数据库写法, 但是如果是 java, 用的还是 mybatis, 绝大多数人用的就是多行插入, 因为在 xml 里来个 for 循环标签就搞定了, 而批量插入则复杂的多, 很多人根本不会.
|
13
ChoateYao 2021-06-25 17:21:19 +08:00
|
14
Cookieeeeee 2021-06-25 18:43:06 +08:00
批量快,只需要用一个连接,尽管有连接池,我是这么理解的。
|
15
love 2021-06-25 19:17:36 +08:00
以前看过一个评测,印象中多行比批量快得多,至少一倍那种
|
16
rekulas 2021-06-25 22:58:44 +08:00
理论上多行快-前提是不出错和导致阻塞、死锁的情况下
相对之下单条更安全点,如果是线上高负载的数据库,应该优先考虑单条 |
17
awing 2021-06-26 00:03:02 +08:00
取决于数据规模吧。批量放在一个事务里,当然好些。
但是还是要尽可能避免长事务。数据量过大最好也拆成多个事务 ( me 只会纸上谈兵 |
18
ch2 2021-06-26 08:59:58 +08:00
第二种,你看过 mysql 导出的数据库的.sql 脚本就知道了
|
19
yrj 2021-09-01 13:23:19 +08:00 via iPad
个人不权威测试:第二种多行会快一丢丢,但第一种批量比较好写代码,所以性能要求不极致的我,选择第一种
|