2012-09-29 7 views
0

LOAD DATA 기능을 허용하지 않는 공유 웹 공간에서 약 1600 만 레코드를 MySQL 5.1 서버에 업로드해야합니다. 이 테이블은 Innodb 테이블입니다. 아직 키를 할당하지 않았습니다.엄청난 양의 데이터를 MySQL 서버에 업로드

따라서 파이썬 스크립트를 사용하여 2.5GB 크기의 CSV 파일을 개별 INSERT 문과 함께 SQL 파일로 변환합니다. SQL 파일을 시작했는데 프로세스가 매우 느립니다. 매분마다 1000-1500 줄이 처리됩니다.

한편, 대량 삽입에 대해서는 읽었지만 하나의 삽입 문이 가질 수있는 레코드 수를 알려주는 신뢰할만한 출처는 찾지 못했습니다. 아십니까?

키가없고 나중에 추가하는 것이 유리합니까?

모든 삽입 주위의 트랜잭션이 프로세스 속도를 향상시킬 수 있습니까? 사실, 현재 데이터베이스에서 작업하는 단일 연결 (광산)이 있습니다.

+0

트랜잭션이 느려질 수 있습니다. –

답변

1

insert ... values ... 구문을 사용하여 단일 요청을 실행하는 여러 행을 삽입하는 경우 쿼리 크기는 행 수가 아닌 max_allowed_packet 값으로 제한됩니다.

키 관련 : 데이터 조작 전에 키를 정의하는 것이 좋습니다. 실제로 모델을 만들 때 키, 관계, 인덱스 등을 생각해야합니다.

데이터를 삽입하기 전에 인덱스를 정의하는 것이 좋습니다. CREATE INDEX은 거대한 데이터 세트에서 매우 느리게 작동합니다. 그러나 색인 생성을 연기하는 것은 큰 단점이 아닙니다.

삽입을 더 빠르게하려면 autocommit 모드를 켜고 테이블에서 동시 요청을 실행하지 마십시오.

+0

max_allowed_packet 크기는 16,777,216이므로 한 개의 INSERT 행이 약 300 바이트의 텍스트 인 경우 삽입 실행 당 약 50,000 개의 레코드를 의미합니다. – Steve06

+0

또한 자동 커밋은 내 서버에서 기본적으로 켜져 있습니다. – Steve06

+0

나는 한 번에 10,000 개의 레코드가있는 대량 삽입물을 생성하도록 스크립트를 변경했는데 이것이 실제로 해결책이었습니다! 한 번의 삽입으로 약 1 주일 씩 실행하면 실행 시간이 약 6 시간으로 줄어 들었습니다. 좋은 물건! – Steve06

관련 문제