2011-07-28 2 views
0

나는 여러 테이블과 MySQL의 DB를 가지고,의 내가이 테이블mysql db에 데이터를 삽입하는 데 가장 효율적인 옵션은 무엇입니까?

가장 효율적인

각각에 여러 통화를 할 수있는 등 표 1, 표 2, 그들을 부르 자

A)에 대한 모든 쿼리를 수집 하나의 메시지, 각 테이블은 그 다음 예를 들어, 개별적으로 실행 :

INSERT INTO TABLE1 VALUES (A,B); 
INSERT INTO TABLE1 VALUES (A,B); 

는 ...

INSERT INTO TABLE2 VALUES (A,B); 
INSERT INTO TABLE2 VALUES (A,B); 

실행 ... execut 하나의 긴 메시지의 모든 쿼리를 수집 전자

B) (안 테이블의 순서), 다음이 쿼리를 실행의 예 : : 다른

INSERT INTO TABLE1 VALUES (A,B); 
INSERT INTO TABLE2 VALUES (B,C); 
INSERT INTO TABLE1 VALUES (B,A); 
INSERT INTO TABLE3 VALUES (D,B); 

C) 뭔가?

현재 옵션 (b)처럼하고 있지만, 더 좋은 방법이 있는지 궁금합니다.

(나는 데이터베이스에 액세스하기 위해 jdbc를 사용하는데 그루비 스크립트로).

감사합니다.

+0

일괄 모드에 대해 들어 보았습니다. 이것은 java http://www.java2s.com/Code/Java/Database-SQL-JDBC/BatchupdateforMySQL.htm의 예제입니다. 그러나 PostgreSQL과 비슷한 작업을 수행해도 성능이 크게 향상되지 않아 도움이되는지 여부는 알 수 없습니다. – Ankur

+1

현재 사용중인 코드가 도움이 될 수 있습니까? –

답변

0

어떤 것이 더 효율적인지보다는 먼저 테이블이 크고 동시성이 필요한지 여부를 고려하십시오.

(수백만 개의 레코드가있는 경우) 명령문을 명령문별로 분리하고 각 명령문 사이에 시간을 주어야하므로 한 번에 너무 긴 테이블을 잠그지 않을 수 있습니다.

테이블 크기가 크지 않거나 동시성에 문제가 없다면 꼭 수행하십시오. 문의 내용의 slow logs을보고 어떤 문장이 더 빠르는지 확인하십시오.

+0

아니, 그들은 각 테이블에 대해 레코드의 ~ 5000에 대해서만 크지 않습니다 .. 조언 주셔서 감사합니다 :) – franka

1

세 번째 옵션 - 준비된 문 사용.

1

코드를 게시하지 않으면 약간의 실수를 범하게 만들었지 만 this blog post은 groovy Sql.withBatch method을 사용하여 성능이 크게 향상되었습니다.

그들이 후손 여기를 재생 (sqlite를 사용하는) 보여 코드 :

이 분명히 작동하도록 조정해야합니다

dummyTable 테이블에 1000 숫자 1을 삽입

Sql sql = Sql.newInstance("jdbc:sqlite:/home/ron/Desktop/test.db", "org.sqlite.JDBC") 
sql.execute("create table dummyTable(number)") 

sql.withBatch {stmt-> 
    100.times { 
     stmt.addBatch("insert into dummyTable(number) values(${it})") 
    } 
    stmt.executeBatch() 
} 

당신의 알 수없는 코드

관련 문제