2009-05-10 2 views
0

업로드 된 CVS 파일에서 100000-500000 행 내 db 테이블을 업데이트해야 할 때 배치 프로세스가 있습니다. 일반적으로 20 ~ 30 분이 소요되며 때로는 더 오래 걸립니다.PHP로 오랫동안 배치 프로세스를 수행하는 방법은 무엇입니까?

가장 좋은 방법은 무엇입니까? 그 좋은 연습? 어떤 제안이라도 환영받을 것이다

고마워.

+0

흠, 다시 한 번 질문을 읽을 때 - 실제로 * 처음에 MySQL을 사용합니까? – Tomalak

답변

1

많은 삽입 작업을 수행중인 경우 대량 삽입 작업을 수행하고 있습니까? 예 :

INSERT INTO table (col1 col2) VALUES (val1a, val2a), (val1b, val2b), (.... 

이렇게하면 삽입 속도가 크게 빨라집니다.

당신이 할 수있는 또 다른 일은 변경하는 동안 색인 생성을 비활성화 한 다음, 끝나면 한 번에 색인을 다시 작성하도록합니다.

당신이 최적화 할 수 있도록 코드의 가장 느린 부분을 찾아 도움을 줄 수있는 Benchmark_Profiler 클래스가 Benchmark라는 패키지를 가지고 무슨 일을하고 당신이 더 많은 아이디어

1

PEAR를 얻을 수 있습니다에 대해 조금 더 자세히 .

1

큰 응용 프로그램에서와 같은 기능이 있습니다. 우리는 csv에서 9 개의 인덱스가있는 테이블로 수백만 행을 삽입하는 문제가있었습니다. 많은 리펙토링 후에 데이터를 삽입하는 이상적인 방법은 mysql LOAD DATA INFILE 명령을 사용하여 [임시] 테이블에로드하는 것인데 거기에서 변환을 수행하고 여러 삽입 쿼리를 사용하여 결과를 실제 테이블 (INSERT INTO ... SELECT FROM)에만 복사합니다 각 쿼리마다 50k 줄 정도 (단 하나의 삽입물을 발행하는 것보다 효과적이지만 YMMV는 더 좋습니다.)

+0

젠장. 너는 나를 때렸다.:) +1 – Tomalak

7

CSV에서 500.000 개의 행을 가져 오는 데 30 분이 걸립니까?

MySQL이 힘든 일을하는 것을 고려한 적이 있습니까? 당신은 미리를 변환하는 PHP를 사용하거나로드 할 수 있습니다,

LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name 
    FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
    LINES TERMINATED BY '\n'; 

파일이 목표 테이블에 바로 가져올 수있는 권리 모양으로 아주없는 경우 : CSV 파일 처리를 지원하는 LOAD DATA INFILE있다 "스테이징"테이블에 넣고 MySQL이 필요한 변환을 — 중 더 빠르고 더 편리하게 처리하도록합니다.

추가 옵션으로 MySQL Native Driver for PHP (MYSQLND)을 통해 MySQL 쿼리를 비동기 적으로 실행할 수 있습니다. 어쩌면 그 옵션을 탐색 할 수도 있습니다. UI 성능을 유지할 수 있습니다. 사용자 프레스 버튼을 말했을 때이 사용자 제어하에 사촌

+0

지금은 MySQL의 performace에 대해 일괄 처리 내가 다른 관련 테이블을 업데이 트해야합니다,하지만 삽입, 업데이트, 응용 프로그램의 상태를 지불, 정말 오랜 시간이 걸립니다, coz 내가 몇 가지 코드 로직을 할 필요가, 같은 테이블에 몇 가지 레코드를 만들고, 고객에게 알립니다 (전자 메일 메시지를 메일 큐에 넣음). 그래서 php exec와 함께하는 thinkign, 나는 단지 백그라운드 프로세스로 실행하고 작업을 끝내는 데 시간을 갖도록하십시오. 나는 cron과 함께 할 수 없다. 이것은 사용자가 제어 할 수있다. 사용자가 프로세스 버튼을 클릭하면 나중에 로그를 확인하여 프로세스 상태를 볼 수있다. 답장을 보내 주신 Tomalak에게 감사드립니다. – taras

+0

이제는 mysql performace = mysql performace에 관한 것이 아닙니다 – taras

+1

알겠습니다. 나는 어딘가에 비효율을 가정하고 있었지만, 많은 일을한다면 자연스럽게 시간이 걸립니다. 행운을 빕니다! :) – Tomalak

0

나는, 크론 함께 할 캔트, 로그를 확인할 수 있습니다 이후에 사용자가 클릭 프로세스 버튼과 프로세스 상태

를보고, 설정 데이터베이스의 테이블에있는 플래그. 그런 다음 크론 작업에서이 플래그를 확인하십시오. 그곳에 있다면 처리를 시작하고 그렇지 않으면하지 마십시오. 적용 가능합니다. 동일한 테이블을 사용하여 일종의 상태 업데이트 (예 : xx % 완료)를 게시 할 수 있으므로 사용자가 진행 상황에 대한 피드백을 얻을 수 있습니다.