2009-09-02 5 views
2

테스트를 위해 약 5 억 개의 행 가비지 데이터를 데이터베이스에 삽입하려고합니다. 지금은 SELECT/INSERT 진술을 각각 TRANSACTION 내부에 반복하는 PHP 스크립트가 있습니다. 이것은 분명히 최선의 해결책은 아닙니다. 테이블은 InnoDB (행 수준 잠금)입니다.포크 MySQL INSERT INTO (InnoDB)

내가 (제대로) 프로세스를 포크하면이 프로세스가 최대 속도가 이 될까요? 그것이 완료 될 때까지 140 시간이 걸릴 것입니다. 나는이 두 가지에 대한 걱정 :

  1. INSERT 문 쓰기 잠금을 획득해야하는 경우, 다음이 분기 렌더링 쓸모없는, 여러 프로세스가 동시에 같은 테이블에 쓸 수 있기 때문에?

  2. 저는 SELECT...LAST_INSERT_ID() (TRANSACTION 안에 있음)을 사용하고 있습니다. 여러 프로세스가 데이터베이스에 연결될 때이 논리가 깨지십니까? 각 포크에 대해 새 데이터베이스 연결을 만들 수 있으므로이 문제를 피할 수 있기를 바랍니다.

  3. 몇 개의 프로세스를 사용해야합니까? 쿼리 자체는 간단하며 일반적인 듀얼 코어 개발 상자에 2GB RAM이 있습니다. 나는 InnoDB를 8 개의 쓰레드 (innodb_thread_concurrency=8)를 사용하도록 설정했지만, 8 개의 프로세스를 사용해야하는지, 아니면 이것이 일치하는 방법에 대해서 생각하는 올바른 방법인지는 확실하지 않다.

도움 주셔서 감사합니다.

답변

4

1) 예, 잠금 경합이 있지만 innodb는 삽입을 시도하는 여러 스레드를 처리하도록 설계되었습니다. 물론, 그들은 동시에 삽입하지 않을 것이지만, 당신을 위해 삽입을 직렬화하는 것을 처리 할 것입니다. 거래를 구체적으로 종료하고 최대한 빨리 처리하십시오. 이렇게하면 최상의 인서트 성능을 얻을 수 있습니다.

2) 아니요. last_insert_id()가 특정 연결이기 때문에이 논리는 스레드 당 하나의 연결이 있으면 중단되지 않습니다.

3) 이는 벤치마킹을 통해 파악해야하는 사항 중 하나입니다. 실제로, 나는 프로그램을 스스로 조정할 것이다. 8 개의 스레드로 100 개의 인서트를 실행하고 실행 시간을 기록하십시오. 그런 다음 반으로, 반으로 다시 시도하십시오. 어느 것이 더 빠르든지간에, 그 수를 중심으로 더 많은 스레드 수 값을 벤치 마크하십시오.

일반적으로 이러한 유형의 항목을 벤치마킹하면 더 빨리 볼 수 있습니다. 그것에 대해 생각하고 그것을 써 넣는 데 걸리는 시간 내에 미리 예비 숫자가있을 수 있습니다.

+0

자세한 답변을 보내 주셔서 감사합니다. 걱정할 이유가별로 없다는 것을 알고 기뻐하십시오. – ash

7

많은 수의 레코드를 효율적으로 삽입하려면 MySQL 설명서에 a discussion이 있습니다. 분명한 승자는 LOAD DATA INFILE 명령을 사용한 다음 여러 값 목록을 삽입하는 삽입이 뒤 따른 것 같습니다.

+0

팁 주셔서 감사합니다! 20 배 빠르며 우수합니다. – ash

관련 문제