资讯详情

Mysql 批量插入大量数据的两种方案以及优缺点(分别是 5W 条数据和 10W 条数据)

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 那里有没有参数,或者有没有打错。

标签: 1zs5脚20a继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台