基于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/524905

相关文章

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读