基于MybatisPlus批量高效插入百万条数据

2023-12-22 17:52

本文主要是介绍基于MybatisPlus批量高效插入百万条数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

在JAVA程序开发中,对数据库进行大量数据插入是一个常见的操作,作为一个软件开发工程师,大批量的数据处理是日常工作,如何优化插入性能,提升数据处理效率是对大多数工程师的一个重要考验。本文将围绕逐条插入和批处理插入两种方式,结合MybatisPlus的实例,以及配置MySQL的连接参数来提升批处理插入的效率。

逐条插入的低效性能

首先,我们通过一个简单的测试展示了10万条数据逐条插入的执行情况,效率不要太低了。代码中使用了IService中的逐条插入功能,通过循环逐个插入10万条数据。结果表明,这种方式的性能较差,执行时间较长,如下图所示,每条语句,都会单独发送数据库执行,网络开销很大,执行效率很差,测试时,10万条数据的插入操作,用时120878ms,大约2分钟时间。
在这里插入图片描述

使用批量插入

接下来,我们引入MybatisPlus的批处理插入方式,通过saveBatch方法实现。测试结果显示,通过批处理插入,性能提升了约10倍,测试时用时测试时用时18500ms,即18秒, 比单条单条插入用时2分多种几乎快了10倍。

在这里插入图片描述
深入源码发现,MybatisPlus的批处理本质上还是使用了PrepareStatement的预编译模式,一个批量多条Insert语句,被预编译成一整个语句,一次发送给mysql执行,最终在数据库执行时仍然是一整个多条insert语句,一句一句执行,每次插入一批数据,相比单条单条的执行,少了大量的网络传输次数(从应用系统将sql传到数据库),性能提升了将近10倍。
在这里插入图片描述

优化思路:合并多条SQL为一条

为了进一步提高性能,我们可以考虑将多条SQL合并为一条,减少与数据库的交互次数。具体而言,我们希望生成的SQL语句形如:

INSERT INTO person ( name, phone, birthday, status, detail, create_time, update_time ) VALUES('person_1','18900000001', '2000-01-16', 1, 'person detail 1', '2023-12-22T16:22:13.725', '2023-12-22T16:22:13.725'),('person_2','18900000002', '2000-02-16', 1, 'person detail 2', '2023-12-22T16:22:13.725', '2023-12-22T16:22:13.725'),('person_1000','189000001000', '2000-03-16', 1, 'person detail 1000', '2023-12-22T16:22:13.725', '2023-12-22T16:22:13.725');

合并多条SQL为一条,不需要自己来做,mysql已经进行了支持,只需要在mysql连接字符串配置时,增加rewriteBatchedStatements=true即可,默认情况下,该参数为false。 如下图所示,增加配置为true。
JDBC中,批量插入数据可以提高数据库的性能。当使用PreparedStatement进行批量插入时,会使用到“多个值的插入”语句。而在MySQL 5.1.13版本之前,每个插入语句都会向服务器发送一次请求,导致性能较低。当设置rewriteBatchedStatements=true参数时,JDBC会将多个插入语句合并成一个较长的插入语句,然后向服务器发送一次请求,从而提高数据库的性能。
在这里插入图片描述
参数调整后,批量操作代码不需要做调整,直接运行,如下图所示, 配置rewriteBatchedStatements=true后,将一个批处理操作转成一条Insert语句, 用时 8350ms, 又快了2倍多,10万数据通过mysqlplus批量入库,只用了8秒, 效率杠杠地。
在这里插入图片描述

结语

通过本文的介绍,我们从逐条插入到批处理插入,再到优化批处理插入,一步步提升了数据插入的性能。MySQL的 rewriteBatchedStatements 参数为我们提供了一种简单而有效的性能优化手段,通过减少与数据库的交互次数,达到了加速批处理插入的目的。

在实际项目中,可以根据具体情况选择适当的插入方式,并通过合理配置数据库连接参数来进一步优化性能。在大规模数据插入的场景下,这些优化措施将为系统的稳定性和性能提供有力支持。

通过深入理解数据库底层机制,结合实际应用场景,我们可以更好地发挥数据库的潜力,为项目的成功实施提供更可靠的基础支持。希望本文的内容能够对读者在实际开发中遇到的数据库性能优化问题有所启发。

这篇关于基于MybatisPlus批量高效插入百万条数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/524904

相关文章

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

MyBatisPlus乐观锁和悲观锁的实现示例

《MyBatisPlus乐观锁和悲观锁的实现示例》本文主要介绍了MyBatisPlus乐观锁和悲观锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录1.场景2.乐观锁和悲观锁3.乐观锁实现4.悲观锁1.场景一件商品,成本价是80元,售价是10

使用Python实现高效复制Excel行列与单元格

《使用Python实现高效复制Excel行列与单元格》在日常办公自动化或数据处理场景中,复制Excel中的单元格、行、列是高频需求,下面我们就来看看如何使用FreeSpire.XLSforPython... 目录一、环境准备:安装Free Spire.XLS for python二、核心实战:复制 Exce

pandas批量拆分与合并Excel文件的实现示例

《pandas批量拆分与合并Excel文件的实现示例》本文介绍了Pandas中基于整数位置的iloc和基于标签的loc方法进行数据索引和切片的操作,并将大Excel文件拆分合并,具有一定的参考价值,感... 目录一、Pandas 进行索引和切编程片的iloc、loc方法二、Pandas批量拆分与合并Exce

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p