MySQLの大量挿入データのいくつかの方法
4612 ワード
最近会社はデータベースの性能をテストすることを要求して、インターネットを利用していくつかの大量のデータを挿入するコードを調べて、いくつかの異なる使い方があることを発見して、同じデータを挿入する時間も違いがあります
他はともかく、前のコードを君と共有する.
方法1:
時間:1952 ms
説明:この速度は、目に入らないですね.会社のデータベースは、ハードウェアから見てもソフトウェアから見ても、だめですね.
方法2:
消費時間:未知です.なぜなら、私がこの方法でテストしたとき、メモリオーバーフロー異常を報告してくれたからです.この方法に必要なメモリが大きく、消費時間が高いことを説明してくれたので、上の方法と比較しました.
2つのメソッドはprepareStatementクラスで使用されるため、このクラスはsql文を実行する前にプリコンパイルされます.つまり、sqlを準備して、使うときにそのまま使えばいいのです
方法1:コード分析を通じて、明らかに見ることができて、方法の1種のsql文は10本のsql文につなぎ合わせることを通じて、だからデータベースは文を実行する時、10本を実行すればいいです
方法2:1サイクルごとにaddBach()が1回必要になり、速度がさらに遅くなり、10000本あればaddBatch()が1万回、バッチ処理が10回あるので、速度が遅くなるのは当然である
他はともかく、前のコードを君と共有する.
方法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回あるので、速度が遅くなるのは当然である