Mysql 批量插入(5W 条数据和 10W 条数据)
1.批量插入思路
一般有两种不同的想法:
1、for 批量插入循环
2、生成一条 SQL 语句,比如 insert into user(id,username) values(1,“zs),ls”)…
2.两种思维的优缺点
a、for循环的优缺点
如果是 for 优点是:
- PreparedStatement 具有预编译功能。
劣势:
- 要插入 10W 次,需要 10W 次网络 IO。
b、SQL 句子的优缺点
如果是单条 SQL 句子的优点是:
- 一条 SQL 只需要一次网络 IO。
劣势:
- 单条 SQL 过大,需要对数据分片。比如 10W 条数据分为两条,包括 5W 数据的 SQL 语句。
- 单条 SQL 语句过大,MySQL 降低分析速度。
- 不能充分发挥 PreparedStatement 预编译功能。
3.开始测试(这里测试) 5W 条数据)
首先在数据库中创建一个表。这个可以自己创建。
本来打算测试 10W 插入条数据。但是因为单条 SQL 句子太大,会报错,需要分片。虽然分片不难,但与主题无关,所以在这里使用 5W 测试条数据。效果是一样的。结论是一样的。
a、前期准备
这里用的是 SpringBoot 项目。
这里展示测试中使用的依赖:
pom.xml 加这样一段:
数据库:
然后是 mapper:
实体类自己看情况写;
然后是 service:
为有效地看到效果,这里先演示一下错误的写作方法:
b、开始测试(最原始的 for 循环)
测试代码: 结果:
其实这里演示的很原始 for 循环使用循环 jdbc 内部提供的批处理。
b、第二次测试(使用 jdbc 的批处理)
看下图:
但这还不够,如果只是这样,还是不需要批处理。 如果不添加此参数,即使代码使用批处理,jdbc 这个参数也会被忽略,看下图: 不够,不能用 mapper,因为这个东西没有使用批处理的功能,这是很常见的 mapper。
因此,有必要获得批处理功能 mapper;修改 service 代码: 到此结束。
然后清空数据,然后执行:
最终测试效果:
可以看出,很明显,效率要快得多。之所以能这么快,不仅是因为开启了批处理功能,还因为博主的性能太好,所以会很快。
c、第三次测试(单条 SQL)
mapper : server:
测试代码:
最终效果:
可见明显是比批处理。 for 循环慢的。
4、测试 10W 条数据
这里直接得出结论
a、批处理 for 循环
b、单条 SQL 语句
请注意,这里有可能报告这个错误: 单条 SQL 语句过大。
这里有两决方案:
然后最终结果:
5、最终结论
最终结论就是:
如果是慢的,要检查数据库 url 那里有没有参数,或者有没有打错。