2011-04-21 6 views
0

약 500 000 개의 행을 포함하는 테이블이 있습니다. 하루에 한 번이 테이블을 외부 API와 동기화하려고합니다. 대부분의 경우 마지막 업데이트 이후 변경 사항이 거의 없거나 전혀 없습니다. 제 질문은 기본적으로 최상의 성능을 위해 MySQL 쿼리를 어떻게 구성해야합니까? 삽입 무시를 사용하는 방법에 대해 생각해 봤지만 몇 줄만 삽입되고 MySQL이 테이블의 모든 행을 반복해야하기 때문에 이동하는 것이 가장 좋은 방법이라고 생각하지 않습니다. 또한 LOAD_DATA_INFILE을 사용하여 임시 테이블의 모든 행을 삽입 한 다음 원래 테이블에없는 행을 선택하고 임시 테이블을 제거하는 방법에 대해 생각해 보았습니다. 어쩌면 다른 누군가가 더 좋은 제안을했을 수 있습니까?외부 데이터베이스와 로컬 데이터베이스 동기화

미리 감사드립니다.

답변

0

보통 임시 테이블과 LOAD DATA INFILE 벌크 로더를 사용합니다. 벌크 로더는 동적으로 생성 된 쿼리를 사용하여 레코드를 삽입하는 것보다 훨씬 효율적입니다.

API의 키와 관련된 고유 키를 사용하여 영구 테이블을 인덱싱하는 경우 INSERTUPDATE 문이 매우 빠르게 작동해야합니다. 이 예에서

INSERT INTO keywords(api_adgroup_id, api_keyword_id, keyword_text, match_type, status) 
SELECT a.api_id, a.keyword_text, a.match_type, a.status 
FROM tmp_keywords a LEFT JOIN keywords b ON a.api_adgroup_id = b.api_adgroup_id AND a.api_keyword_id = b.api_keyword_id 
WHERE b.api_keyword_id IS NULL 

, 나는 이미 존재 여부를 확인하기 위해 keywords 테이블에 OUTER JOIN을 수행 다음과 같이 내가 사용 INSERT 쿼리의 유형의 예입니다. 임시 테이블에서 기본 테이블에 일치하지 않는 행 ( keywords 테이블의 api_keyword_idNULL) 만 삽입됩니다.

애드워즈 API는 동일한 키워드/일치 유형 조합에 동일한 ID가 두 개 이상 존재할 경우 동일한 ID/일치 유형 조합을 제공하므로 키워드를 고유하게 식별하기 위해이 예에서 광고 그룹 ID와 키워드 ID를 모두 사용해야합니다. 광고 그룹

관련 문제