2010-06-22 10 views
3

그래서 일부 판매 데이터를 MySQL 데이터베이스로 가져 오려고합니다. 데이터는 원래 원시 CSV 파일의 형태로되어 있습니다. PHP 응용 프로그램은 먼저 처리 한 다음 처리 된 판매 데이터를 데이터베이스에 저장해야합니다.대량 데이터를 MySQL에 가져 오기

처음에는 개별적으로 INSERT 개의 쿼리를 수행했는데, 이는 매우 비효율적이었습니다 (~ 6000 개의 쿼리는 거의 2 분). 그런 다음 하나의 큰 쿼리를 생성하고 INSERT 데이터를 한 번에 모두 편집했습니다. 이로 인해 효율성이 3400 % 향상되었고 문의 시간이 3 초으로 바로 넘어졌습니다.

그러나 이해할 수 있듯이 LOAD DATA INFILEINSERT 검색어보다 훨씬 빠릅니다. 이제 처리 된 데이터를 텍스트 파일에 쓰고 LOAD DATA INFILE을 사용하여 데이터베이스로 가져 오려고합니다. 데이터베이스에 많은 양의 데이터를 삽입하는 최적의 방법입니까? 아니면 완전히 잘못된 방향으로 가고 있습니까?

대부분 숫자 데이터의 수천 행이 사물의 웅장한 계획에별로 없지만이 인트라넷 응용 프로그램을 가능한 한 신속하게 만들려고 노력하고 있습니다. 또한 프로그램을 다른 회사에 라이센스하기로 결정한 경우이 프로세스가 확장되도록하고 싶습니다.

UPDATE :

그래서 내가 가서 않았고 제안 (지금 두 번 디스크에 동일한 데이터를 기록 이후) 시험 LOAD DATA INFILE가 생각이 나에게 유일한 한계 속도가 증가를 줄 수도에서,하지만 난이었다 쿼리 시간을 3300ms 이상에서 ~ 240ms로 줄 였을 때 놀랐습니다. 이 페이지는 총 실행에 약 1500ms가 걸리지 만 여전히 이전보다 훨씬 눈에 띄게 좋습니다.

데이터베이스에서 불필요한 인덱스가 있는지 확인하고 InnoDB 테이블 2 개를 제외하고 전체 성능을 최적화하기 위해 InnoDB 버퍼 풀을 최적화합니다. .

+1

나는이 질문이 몇 달 전에 게시되었음을 알고 있지만, 일괄 INSERT와 LOAD DATA INFILE 간의 차이점은 시간을 절약 할 수 있다고 말해야합니다. 나는 INSERT로 30 초/그 이상을 30 컬럼 CSV 파일로 ~ 11000 라인을로드하는 약 10 초로 옮겼다. –

답변

4

LOAD DATA INFILE은 매우 빠르며 텍스트 파일을 MySQL로 가져 오는 올바른 방법입니다. 또한 이에 따라, 빠르게 20 회 데이터 -up의 삽입을 가속화하기위한 권장 방법 중 하나이다 :

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

텍스트 파일로 다시 가공 데이터를 작성하는 단계를 삽입보다 더 빠르다는 것을 가정 데이터베이스에 저장하면 좋은 방법입니다.

1

당신의 접근 방식으로 잘해야합니다. LOAD DATA INFILE이 대량 INSERT와 얼마나 비교되는지는 잘 모르겠지만, 똑같은 것을 들었습니다. 더 빨라야합니다.

물론 벤치 마크를하고 싶다면 테스트 코드를 작성하는 것이 좋을 것입니다.

3

로드 데이터 또는 여러 인서트는 단일 인서트보다 훨씬 좋을 것입니다. LOAD DATA는 당신에게 그다지 신경 쓰지 않는 작은 것을 저장합니다.

어떤 경우 든 하나의 트랜잭션에서 너무 많이 수행하지는 마십시오. 트랜잭션 당 10,000 개의 행이 일반적으로 적절하다고 느낍니다 (NB : 비 트랜잭션 엔진과 관련이 없음). 트랜잭션이 너무 작 으면 로그를 디스크에 동기화하는 데 모든 시간을 소비합니다.

큰 삽입 작업을 수행하는 대부분의 작업은 값 비싸고 메모리 집약적 인 작업 인 인덱스 작성에서 비롯됩니다.

성능이 필요한 경우,

  • 테이블 및 모든 인덱스가 InnoDB의 버퍼 풀 (여기 가정 이노)
  • 그냥 RAM을 추가에 맞지 확인 가능한 한 적은 수의 인덱스가 (64G는 요즘 너무 비싸지 않다.)

MyISAM을 사용해야하는 경우, 몇 가지 더러운 트릭이있다. 나는 더 이상 논의하지 않을 것이다.

2

얘들 아, 나는 같은 질문을했다. 나의 필요는 일반보다 조금 더 구체적일지도 모르지만 나는 나의 연구 결과에 관한 글을 여기서 작성했다. 내 요구로드 데이터의 경우

http://www.mediabandit.co.uk/blog/215_mysql-bulk-insert-vs-load-data

빠른했지만, 비행 시간은 대량 삽입보다 더 오래 걸린 평균 부하를 의미에 대한 필요성이 플랫 파일에 저장합니다. 게다가 나는 200 개 이상의 쿼리를하는 것보다 더 많은 일을 할 필요가 없었다. 한 번에이 작업을 수행하기 전에, 지금은 그들을 부풀려서 시간을 절약 할 수있다.

어쨌든,이게 도움이 될까요?

+0

흥미 롭습니다. 이것은 많은 유스 케이스에 대해 알아두면 좋지만, 0.0013 초 수치를 얻는 방법에 대해 다소 혼란 스럽습니다. (나는 통계가 좋지 않다.) –

+1

Lese : 표준 편차와 관련있다. 표준 편차에 대한 나의 이해는 평균과 얼마나 차이가 있는지를 보여줍니다. (엑셀이 계산 해 줬어.) 내 요점은 벌크의 표준 편차가로드 데이터의 표준 편차보다 작았다는 점이었습니다. 이것은 나에게 BULK가 가장 일관되게 더 빠르다는 것을 의미했습니다. 이것에 대해 결정할 때 가장 중요한 요인은 무엇 이었습니까. 주로 라이브 사이트에서 작업 중이기 때문입니다. 희망적으로 이것이 의미가 있습니까? 자세한 내용은 여기를 참조하십시오 : http://en.wikipedia.org/wiki/Standard_deviation – Andy

관련 문제