mysql 批量插入和多行插入 哪种方式更好一点呢 ?

2021-06-25 13:27:44 +08:00
 git00ll

批量插入指的是:

同一事务内,同一个 PreparedStatement,for 循环,反复赋值提交,最终提交一次事务

多行插入指的是:

拼接类似于下面这种语句 insert into table values(x,y,z),(x,y,z),(x,y,z);


如果需要插入大量数据,使用哪种方式更好呢?

数据库使用 Mysql

3688 次点击
所在节点    MySQL
19 条回复
yitingbai
2021-06-25 13:29:07 +08:00
个人觉得多行插入速度更快些
wolfie
2021-06-25 13:54:55 +08:00
java.sql.Statement#executeBatch
redcoffeecat
2021-06-25 14:04:49 +08:00
差不多
kiracyan
2021-06-25 14:12:19 +08:00
写个代码插个一万行就知道了
cnoder
2021-06-25 14:13:21 +08:00
多行插入注意下数据上限~有的可能有参数数量上限或者考虑 binlog-row 一时间写入太多~。。但我还是喜欢多行插入
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
cnoder
2021-06-25 14:14:30 +08:00
看错了 打扰了,当我没说
mcoo1997
2021-06-25 14:32:21 +08:00
批量插入 写起来爽就完事了
simonlu9
2021-06-25 14:53:13 +08:00
insert into table values(x,y,z),(x,y,z),(x,y,z); 这个是原子性的,看二进制日志就是开启了一个事务,你试试中间有一条插入失败,全部都会回滚
cheng6563
2021-06-25 15:11:59 +08:00
多行插入快得多,但不要一次太多行。
在 Java 里,批量插入不会提升太多性能,除非你加上 rewriteBatchedStatements=true 参数,这样连接驱动会把你的批量插入转成多行插入。
xupefei
2021-06-25 16:43:43 +08:00
这两个方案效率一样。
bthulu
2021-06-25 17:03:45 +08:00
效率一样的, 只不过批量插入兼容多种数据库写法, 但是如果是 java, 用的还是 mybatis, 绝大多数人用的就是多行插入, 因为在 xml 里来个 for 循环标签就搞定了, 而批量插入则复杂的多, 很多人根本不会.
ChoateYao
2021-06-25 17:21:19 +08:00
https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html

官方有实际的解释,自己算算开销。
Cookieeeeee
2021-06-25 18:43:06 +08:00
批量快,只需要用一个连接,尽管有连接池,我是这么理解的。
love
2021-06-25 19:17:36 +08:00
以前看过一个评测,印象中多行比批量快得多,至少一倍那种
rekulas
2021-06-25 22:58:44 +08:00
理论上多行快-前提是不出错和导致阻塞、死锁的情况下

相对之下单条更安全点,如果是线上高负载的数据库,应该优先考虑单条
awing
2021-06-26 00:03:02 +08:00
取决于数据规模吧。批量放在一个事务里,当然好些。

但是还是要尽可能避免长事务。数据量过大最好也拆成多个事务

( me 只会纸上谈兵
ch2
2021-06-26 08:59:58 +08:00
第二种,你看过 mysql 导出的数据库的.sql 脚本就知道了
yrj
2021-09-01 13:23:19 +08:00
个人不权威测试:第二种多行会快一丢丢,但第一种批量比较好写代码,所以性能要求不极致的我,选择第一种

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/785746

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX