MySQLの大量挿入データのいくつかの方法

4612 ワード

最近会社はデータベースの性能をテストすることを要求して、インターネットを利用していくつかの大量のデータを挿入するコードを調べて、いくつかの異なる使い方があることを発見して、同じデータを挿入する時間も違いがあります
他はともかく、前のコードを君と共有する.
方法1:
package com.bigdata;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class TestBigData {

	/**
	 * @param args
	 * @throws Exception 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static void main(String[] args) throws Exception {
		//--------------------------------     ----------------------
		String driver="com.mysql.jdbc.Driver";
		String url="jdbc:mysql://127.0.0.1:3306/test";
		String user="root";
		String password="root";
		
		//1、    
		Driver driverInstance = (Driver) Class.forName(driver).newInstance();
		//2、    
		DriverManager.registerDriver(driverInstance);
		//3、    
		Connection conn = DriverManager.getConnection(url, user, password);
		
		//----------------------        -------------------
		//      
		Long begin=System.currentTimeMillis();
		//-----------    ----------
		//sql    
		String sqlPre="insert into tb_big_db (count,create_time,random) values ";
		StringBuffer sb = new StringBuffer();
		//          
		conn.setAutoCommit(false);
		//  PrepareStatement  
		PreparedStatement pstate = conn.prepareStatement("");
		
		//--------------------------     -------------
		//     ,        
		for(int i=0;i<100;i++){
			for(int j=0;j<10000;j++){
				//  sql  
				sb.append("("+j*i+",SYSDATE(),"+i*j*Math.random()+"),");
			}
			//     sql
			String sql = sqlPre + sb.substring(0, sb.length()-1);
			//  sql
			pstate.addBatch(sql);
			//  sql
			pstate.executeBatch();
			//    
			conn.commit();
			//  StringBuffer      sql  
			sb = new StringBuffer();
		}
		//     ,    
		pstate.close();
		conn.close();
		//    
		Long end = System.currentTimeMillis();
		System.out.println("10    ,       :"+(end-begin)+"ms");
	}

}

時間:1952 ms
説明:この速度は、目に入らないですね.会社のデータベースは、ハードウェアから見てもソフトウェアから見ても、だめですね.
方法2:
package com.bigdata;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class TestBigData2 {

	public static void main(String[] args) throws Exception{
		//--------------------------------     ----------------------
		String driver="com.mysql.jdbc.Driver";
		String url="jdbc:mysql://127.0.0.1:3306/test";
		String user="root";
		String password="root";
		
		//1、    
		Driver driverInstance = (Driver) Class.forName(driver).newInstance();
		//2、    
		DriverManager.registerDriver(driverInstance);
		//3、    
		Connection conn = DriverManager.getConnection(url, user, password);
		
		//-----------------------------------     -----------------
		//      
		Long begin = System.currentTimeMillis();
		
		//  sql  
		String sql = "insert into tb_big_db (count,create_time,random) values (?,SYSDATE(),?)";
		//          
		conn.setAutoCommit(false);
		//   sql
		PreparedStatement pstate = conn.prepareStatement(sql);
		//   10 
		for(int i=0;i<10;i++){
			//   10000 
			for(int j=0;i<1000;j++){
				pstate.setLong(1, i*j);
				pstate.setLong(2, i*j);
				//       
				pstate.addBatch();
			}
			//   
			pstate.executeBatch();
			//  
			conn.commit();
		}
		//  
		pstate.close();
		conn.close();
		//    
		Long end = System.currentTimeMillis();
		System.out.println("  10    ,  :"+(end-begin)+"ms");
	}
}

消費時間:未知です.なぜなら、私がこの方法でテストしたとき、メモリオーバーフロー異常を報告してくれたからです.この方法に必要なメモリが大きく、消費時間が高いことを説明してくれたので、上の方法と比較しました.
2つのメソッドはprepareStatementクラスで使用されるため、このクラスはsql文を実行する前にプリコンパイルされます.つまり、sqlを準備して、使うときにそのまま使えばいいのです
方法1:コード分析を通じて、明らかに見ることができて、方法の1種のsql文は10本のsql文につなぎ合わせることを通じて、だからデータベースは文を実行する時、10本を実行すればいいです
方法2:1サイクルごとにaddBach()が1回必要になり、速度がさらに遅くなり、10000本あればaddBatch()が1万回、バッチ処理が10回あるので、速度が遅くなるのは当然である