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

相关文章

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速