
批量插入指的是:
同一事务内,同一个 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 写个代码插个一万行就知道了 |
多行插入注意下数据上限~有的可能有参数数量上限或者考虑 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 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 个人不权威测试:第二种多行会快一丢丢,但第一种批量比较好写代码,所以性能要求不极致的我,选择第一种 |