내 응용 프로그램에서 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
이 도움을 바랍니다!