대량 배치를위한 인서트 속도 40-50,000)에 많은 수의 객체가 있습니다. 샘플

내 응용 프로그램에서 INSERT가 많은 시간을 소비하는 것으로 보입니다. 테이블에 삽입하려는 메모리 (~ 40-50,000)에 많은 수의 객체가 있습니다.

샘플 테이블을 보자

CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB

배치 크기로 3 행을 사용하면 다음은 삽입에 대해 생각할 수있는 접근법입니다.

접근법 1-3 개의 인서트 구성 및 소성

INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');

접근법 2-값을 하나의 쿼리로 클럽 화

INSERT INTO bill (amount, bill_date) VALUES 
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 00:00:00');

접근법 3-이 쿼리를 한 번 실행하면 6 개의 매개 변수가 전달됩니다.

INSERT INTO bill (amount, bill_date) VALUES 
(?, ?), (?, ?), (?, ?);

접근법 4-이 준비된 쿼리를 3 번 ​​실행하여 매번 2 개의 매개 변수를 변경

INSERT INTO bill (amount, bill_date) VALUES (?, ?);

다른 접근법은 환영합니다.

내 질문은

테이블에 여러 번 삽입하는 가장 빠른 방법은 무엇입니까?

mysql insert speed 에서이 링크JDBC programming에 대한이 안내서를 읽었 지만 결론을 내릴 수는 없습니다.

내 경우 –

현재 내 테이블에는 ~ 20 개의 열이 있으며 대부분은 숫자이며 varchar (60) 및 1 개의 텍스트 열이 있습니다. MySQL 버전 5.5. INNODB에서 실행되며 Integer 기본 키에 1 개의 인덱스가 있습니다. 모든 쿼리는 트랜잭션에서 실행됩니다.

Java에서 쿼리를 구성하고 Spring JDBC를 사용하여 쿼리를 실행합니다.

현재 접근법 3을 따르고 있습니다. 빈 테이블에 20,000 개의 삽입을하는 데 약 10 초가 걸리며 쿼리를 작성하는 데 걸리는 시간은 포함되지 않습니다.

관점을 유지하기 위해 테이블에서 데이터를 가져 오는 데 100-200 밀리미터가 걸립니다.

내가 놓친 것이 있습니까? 인서트를 더 빨리 만들려면 어떻게해야합니까?



답변

커밋을 일괄 처리하십시오. 1024의 배치 크기는 시작 크기가 좋습니다. 최적의 처리량에 도달 할 때까지 배치 크기를 변경하십시오.


답변

테스트하거나 삽입하는 대상 DB 테이블에서 인덱스를 삭제하고 작은 배치 된 청크에 삽입 한 다음 (위에 표시된대로 최적) 대상 테이블에서 인덱스를 다시 빌드하십시오. 모든 인서트가 완료되면? 확인하기 위해 테스트하기에 충분히 쉬운 것일 수 있습니다.


답변

mysql 문서의 일부 대량 데이터 로딩 팁이 유용 할 수 있습니다.
https://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-bulk-data-loading.html

몇 가지 방법으로 삽입 속도를 높일 수 있습니다.

- turn off autocommit
- turn off unique check
- turn off foreign check

이 도움을 바랍니다!


답변