MySQL像数据库批量插入100w条数据

本文介绍了一个使用Java进行MySQL批量插入优化的方法,通过设置连接参数和禁用自动提交来提高数据写入效率。测试了在一百万条记录下,开启特定连接参数后的执行时间和性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.test.mysql;

import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
public class MysqlBatchUtil {
private String sql="INSERT INTO tb_user (user_name,password,age) VALUES (?,?,?)"; 
private String connectStr="jdbc:mysql://localhost:3306/test";
private String username="root"; 
private String password="root"; 
private void doStore() throws ClassNotFoundException, SQLException, IOException { 
  Class.forName("com.mysql.jdbc.Driver"); 
  connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";//此处是测试高效批次插入,去掉之后执行时普通批次插入
  Connection conn = (Connection) DriverManager.getConnection(connectStr, username,password); 
  conn.setAutoCommit(false); // 设置手动提交 
  int count = 0;
  PreparedStatement psts = conn.prepareStatement(sql);
  long start = System.currentTimeMillis();
  for(int i=0;i<=1000000;i++){
   psts.setString(1, i+"username1");
   psts.setString(2, i+"password2");
   psts.setInt(3, i);
   psts.addBatch();   // 加入批量处理 
   count++;  
  } 
  psts.executeBatch(); // 执行批量处理 
  conn.commit(); // 提交 
  System.out.println("数量="+count); 
  System.out.println("运行时间="+ (System.currentTimeMillis() - start)+"毫秒");
  conn.close(); 

public static void main(String[] args) {
  try {
   new MysqlBatchUtil().doStore();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
}
}
MySQL中,创建一个用于一次插入一百万条数据的存储过程并不常见,因为一次性处理大量数据可能会导致性能问题,比如内存溢出或者长时间的事务阻塞。通常我们会采用批量插入的方式来提高效率。以下是创建一个分批插入示例的简单存储过程: ```sql DELIMITER // CREATE PROCEDURE InsertDataInBatches (IN data_file TEXT) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE i INT DEFAULT 0; DECLARE record LONGBLOB; OPEN DATA_FILE CURSOR FOR SELECT * FROM TSV_DATA; -- 假设你的数据源在一个名为TSV_DATA的数据表里 REPEAT SET @query = CONCAT('INSERT INTO your_table (column1, column2,...) VALUES ', GROUP_CONCAT(REPLACE(record, '\n', ', '))); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; IF NOT done THEN FETCH DATA_FILE INTO record; SET i = i + 1; IF i >= 10000 THEN SET done = TRUE; -- 这里设定每批次插入10000行 COMMIT; -- 提交一次事务,释放资源然后再继续下一批次 END IF; ELSE CLOSE DATA_FILE; SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insertion finished'; END IF; UNTIL done END REPEAT; END; // DELIMITER ; ``` 在这个存储过程中,我们假设`data_file`是一个文件,其中包含按照逗号分隔的记录。你需要将`your_table`替换为你的目标表名,`column1`, `column2`, ...替换为实际的列名。 要运行这个过程,你可以使用`CALL InsertDataInBatches('/path/to/your/data.txt')`,其中'/path/to/your/data.txt'是你存放数据的文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值