在数据库插入万条数据,比普通插入提升百倍速度

2023-10-17 23:36

本文主要是介绍在数据库插入万条数据,比普通插入提升百倍速度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在数据库插入万条数据,比普通插入提升百倍速度


JDBC中通过普通方法插入一万条数据

   /*** 普通方法插入10000条数据* @throws Exception*/@Testpublic void testInsert() throws Exception {//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///testDb?user=root&password=abc123");//编写sql语句String sql = "insert into user(name,,age,sex) values (?,?,?)";//创建statementPreparedStatement preparedStatement = connection.prepareStatement(sql);//计算插入数据开始时间long startTime = System.currentTimeMillis();for (int i = 1; i < 10000; i++) {preparedStatement.setObject(1, "shiSheng" + i);preparedStatement.setObject(2, "1" + i);preparedStatement.setObject(3, "男" + i);//一条一条插入数据preparedStatement.executeUpdate();}//运行完插入数据的结束时间long endTime = System.currentTimeMillis();//计算两者的差值,也就是插入1万条数据所用的时间long time = endTime - startTime;System.out.println("普通方式执行插入1万个数据消耗的时间:" + time );//关闭资源preparedStatement.close();connection.close();}

运行结果

普通方式执行插入1万个数据消耗的时间:23391

可以看到用了大概23秒的时间,效率十分的低下,这还只是插入最简单数据的情况下


通过批量插入来提升百倍速度
 	/*** 批量插入10000条数据* @throws Exception*/@Testpublic void batchInsert() throws Exception {//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///testDb?rewriteBatchedStatements=true","root","abc123");//编写sql语句String sql = "insert into user(name,,age,sex) values (?,?,?)";//创建statementPreparedStatement preparedStatement = connection.prepareStatement(sql);//计算插入数据开始时间long startTime = System.currentTimeMillis();for (int i = 1; i < 10000; i++) {preparedStatement.setObject(1, "a" + i);preparedStatement.setObject(2, "b" + i);preparedStatement.setObject(3, "c" + i);//将所有要插入的数据添加到values后面preparedStatement.addBatch();}//批量插入数据preparedStatement.executeBatch();//运行完插入数据的结束时间long endTime = System.currentTimeMillis();//计算两者的差值,也就是插入1万条数据所用的时间long time = endTime - startTime;System.out.println("优化方式执行插入1万个数据消耗的时间:" + time );//关闭资源preparedStatement.close();connection.close();}

运行结果

优化方式执行插入1万个数据消耗的时间:231

通过对比可以看到普通方法用了23391毫秒,优化后只用了231毫秒,速度提升了百倍以上,这对项目是一个很大的提升

变动

  • 改动一

在获取连接时加上rewriteBatchedStatements=true,意思是允许批量插入数据

  • 改动二

preparedStatement.executeUpdate();
改为
preparedStatement.addBatch();
由原先的一条一条插入数据,改为把所有要插入的数据都添加到values后面,之后再统一插入数据

  • 改动三

在for循环外加上preparedStatement.executeBatch();数据全部添加完成后统一执行批量插入操作

原因

其实就是调用了statement中的一个批量插入函数,提高了效率。
原先是通过for循环一条一条的插入数据,这样效率很低,现在是通过for循环把要插入的数据都保存到一个地方,循环结束后统一进行插入,这样节省很多空间内存,也提高了效率。


我是时生,一个正在努力的小白。欢迎批评,欢迎指正,欢迎共享。 如果这篇文章对你有帮助,麻烦点个赞呗!

这篇关于在数据库插入万条数据,比普通插入提升百倍速度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt