JAVA:优化MySQL批量插入提升数据写入效率

1、简述

在开发过程中,我们经常需要将大量数据批量插入到MySQL数据库中。但是,普通的单条插入操作效率较低,容易导致性能瓶颈。本文将介绍一些优化MySQL批量插入的方法,以提升数据写入效率。

2、 使用多行插入语句

普通的插入语句每次只能插入一行数据,而多行插入语句可以一次性插入多行数据,减少了通信和解析的开销。

INSERT INTO table_name (column1, column2, column3)
VALUES (value1_1, value2_1, value3_1),
       (value1_2, value2_2, value3_2),
       ...
       (value1_n, value2_n, value3_n);

我们可以使用Mybatis提供的foreach标签,在在对应的Mapper.xml中写好批量的insert语句:

<insert id="insertBankManagents">
 insert into bank_managent( bank_type, bank_no,user_id)
 VALUES
 <foreach collection = "list" item="item" index= "index" separator =",">
 (
 	#{item.bankType}, #{item.bankNo},#{item.userId}
 )
 </foreach>
</insert>

注意:

  • 传入的collection属性,可以分为list,array,map要对应处理。
  • 当前方法可以做到批量导入,但是不足的是不同的数据库可执行的SQL长度不同,处理大批量的数据时慎用当前方式。

3、 提高事务提交间隔

将多次插入操作分批提交事务,可以减少锁的竞争,提高并发性。

START TRANSACTION;
-- 批量插入语句1
-- 批量插入语句2
-- ...
COMMIT;

通过Mybatis内置的ExecutorType方式有3种,其中就有BATCH方式来处理批量的,重复使用已经预处理语句,并且批量执行所有更新的语句,通过对比foreach方式,性能更优:

3.1 Mybatis单个插入语句
<insert id="insertBankManagent">
 insert into bank_managent( bank_type, bank_no,user_id)
 VALUES
 (
 	#{bankType}, #{bankNo},#{userId}
 )
</insert>
3.2 通过BATCH批次插入
@Autowired
private SqlSessionTemplate sqlSessionTemplate;

private void batchInsertBankManagents(List<BankManagent>  bankManagents){
	SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();
	SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
	BankManagentMapper mapper = sqlSession.getMapper(BankManagentMapper.class);
	try{
		//long sTime = System.currentTimeMillis();
		for(int i = 0; i< bankManagents.size(); i ++ ){
			BankManagent bankManagent= bankManagents.get(i);
			mapper.insertBankManagent(bankManagent);
		}
		sqlSession.commit();
	}finally {
		sqlSession.close();
	}
}

注意:
在没有提交Insert之前是无法获取自增ID的,顾要选择业务场景使用。

3、 关闭自动提交

在插入大量数据时,关闭自动提交模式可以将多个插入操作合并成一个事务,提高效率。

SET autocommit = 0;
-- 批量插入语句1
-- 批量插入语句2
-- ...
COMMIT;
SET autocommit = 1;

4、使用LOAD DATA INFILE

如果数据源是一个文件,可以使用LOAD DATA INFILE命令,直接将文件内容导入到表中,效率非常高。

LOAD DATA INFILE 'file_path' INTO TABLE table_name;

5、考虑使用批量插入工具或框架

许多编程语言和ORM框架提供了批量插入的工具或方法,可以更方便地进行大批量数据的插入。

6、优化索引和表结构

在进行批量插入前,考虑是否需要暂时移除索引、触发器等约束,以提高插入效率。

7、使用延迟索引

在插入完数据后再创建索引,可以减少插入时的索引维护开销。

8、分区表

如果数据量非常大,可以考虑将表进行分区,将数据分散到不同的物理存储上,提高查询和插入的效率。

9、结论:

通过以上优化方法,我们可以显著提升MySQL批量插入的效率,特别是在处理大量数据时,这些优化策略将发挥出更为明显的作用。在实际应用中,根据具体场景选择合适的优化方法,将会为系统性能的提升带来显著的帮助。同时,也要注意在优化过程中保证数据的一致性和完整性。
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用Java进行批量写入MySQL,可以使用JDBC批处理功能。以下是一个简单的示例代码,用于批量插入数据MySQL表中: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class BatchInsertExample { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; try { Connection conn = DriverManager.getConnection(url, username, password); String sql = "INSERT INTO mytable (column1, column2) VALUES (?, ?)"; // 插入语句 PreparedStatement statement = conn.prepareStatement(sql); // 开始批处理 conn.setAutoCommit(false); // 循环添加参数 for (int i = 0; i < 1000; i++) { statement.setString(1, "value" + i); statement.setString(2, "value" + (i+1)); statement.addBatch(); // 添加到批处理中 } // 执行批处理 int[] rowsInserted = statement.executeBatch(); // 提交事务 conn.commit(); System.out.println("成功插入 " + rowsInserted.length + " 行数据"); // 关闭连接和语句 statement.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 上述代码将使用批量处理将1000行数据插入名为`mytable`的MySQL表中。在循环中,通过`addBatch()`方法将每一行的参数添加到批处理中,最后使用`executeBatch()`方法执行批处理。在所有数据插入完成后,通过调用`commit()`方法提交事务。 请注意,上述代码中的URL、用户名和密码需要根据您的实际情况进行修改。还需要确保项目中已经添加了适当的MySQL驱动程序依赖。 希望对您有所帮助!如有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾荒的小海螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值