2011-03-08 4 views
4

저는 응용 프로그램을 개발 중이며 파일에서 읽은 100,000 개가 넘는 레코드를 가지고 있습니다.이 파일은 MySQL 데이터베이스에 삽입해야합니다.PHP를 통해 MySQL 데이터베이스에 100,000 개 이상의 레코드를 추가하는 최선의 방법은 무엇입니까?

데이터베이스에 이들을 삽입하는 최선의 방법은 무엇입니까?

저는 현재 데이터베이스에서 한 번의 호출로 모든 레코드를 삽입하는 SQL 쿼리를 생성하고 있습니다.

INSERT INTO table (field1, field2) 
VALUES 
(123, 456), 
(125, 984), 
... 

한 번에 삽입 할 수있는 레코드 수에는 제한이 있습니까? 그리고 성능 측면에서 이것이 가장 좋은 방법입니까?

레코드를 여러 개의 쿼리로 분할하는 방법을 고려해 봤지만 이점이 있는지 확실하지 않습니다.

모든 조언을 주시면 감사하겠습니다.

+1

당신은 더 나은 접근 방식을 취할 것입니다. mysqldump는 같은 삽입을합니다. –

답변

3

당신이하고있는 방식은 실제로 매우 효율적입니다. 당신은 여러 쿼리로 쿼리를 분할해야 http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet

+0

고마워요, 정확히 내가 무엇을 찾고 있었습니까. – jbx

+0

구성된 제한에 관계없이 서버에 '숨쉴 시간'을주기 위해 처리량을 제한 할 수 있습니다. 이것이 다른 프로세스를 실행하는 라이브 서버 인 경우, 현명한 덩어리로 삽입을 수행하고 짧은 일시 중지 (2 밀리 초)를 수행 한 다음 계속 진행하는 것은 나쁜 습관이 아닙니다. 이는 다른 프로세스의 성능 저하를 막고 가능한 테이블 잠금을 방지하기위한 것입니다 (동일한 데이터베이스 서버에서 다른 작업을하는 경우에만 다시 문제가됩니다). 성능을 높이고 잠금 문제를 해결하려면 tx_isolation 레이어 매개 변수를 확인해야합니다. –

1

내가 LOW_PRIORITY 또는 DELAYED는 엔진에 따라 한 번에 하나 개의 행을 추가하는 것이 좋습니다 것입니다 볼 수 있도록 최대 쿼리 길이는의 max_allowed_packet 설정에 의해 결정됩니다. 그 이유는 오랜 시간 동안 전체 테이블을 잠그지 않고 테이블의 다른 사용자가 한 번만 읽고 읽고 쓸 수있는 액세스 권한을 갖기 때문입니다.

+0

팁 주셔서 감사합니다, 그것은 확실히 앞으로 유용하게 올 것입니다. – jbx

1
+0

내가 읽고있는 파일의 실제 내용은 내가 쓴 정보를 얻기 위해 많은 처리가 필요하다. 그렇지 않으면 위대한 일을했을 것이다! 감사 – jbx

1

LOAD DATA INFILE 아마 갈 수있는 가장 좋은 방법은 사용 견딜 수 없습니다. 특히 읽는 데이터 파일이 이미 사용할 수있는 형식 인 경우.

1

MySQL의 LOAD DATA INFILE 명령을 사용하여 CSV 파일의 데이터를 삽입 할 수도 있습니다.

관련 문제