2012-01-13 2 views
3

전자 메일을 기반으로 다른 테이블 (10 000 000 레코드)의 필드 값으로 테이블 (250 000 레코드) 필드를 업데이트해야합니다.mysql 쿼리를 통해 1 천만 레코드 업데이트

내가 시도했습니다

: UPDATE의 표 1의 T1, 표 2의 T2 SET의 t1.country = t2.country WHERE t1.email =

t2.email하지만 영원히 "쿼리가 실행되고있다"있어요.

어떤 쿼리를 사용해야합니까?

감사

+1

이것은 일회성 일입니까? 아니면 야간 일처럼 반복해서 할거야? – davogotland

+0

그래, 이건 한 번이야 –

+0

나는 작은 응용 프로그램을 천천히, 줄 단위로 작성하고 얼마나 멀리 갔는지 인쇄하여 사용자를 업데이트하므로 감독자가 여전히 실행 중인지 확인할 수 있습니다. – davogotland

답변

2

이것은 JOIN을 채용 할 수있는 좋은 기회가 될 것입니다.

UPDATE table1 as t1 
JOIN table2 t2 ON t1.email = t2.email 
SET t1.country = t2.country 

쿼리가 처리되는 데에는 아직 시간이 걸리지 만 상당한 시간이 절약되어야합니다.

+0

고마워요.하지만 이건 SQL 구문 오류가 있습니다. –

+0

레오,'UPDATE' 부분에'as t1'가 없습니다. Dan이 친절하게 고쳐주었습니다. –

0

쿼리에 명백한 오류가 표시되지 않습니다.이 경우 데이터베이스에서 오류가 발생합니다. 따라서 우리가보고있는 문제는 업데이트 실행 속도를 높이는 것입니다. 두 개의 이메일 필드 중 하나에 색인이 생성 되었습니까? 그렇지 않은 경우 색인을 추가하고 다시 시도 할 수 있습니까? 예 : ALTER TABLE table2 ADD INDEX (이메일)

+0

나는 또한 성능에 대해 궁금합니다. MySQL에 대해 특별히 잘 알고 있지는 않지만, 계획/실행 경로와 비용, 인덱스 사용 등을 설명하는 것과 동등한 것을보고 싶습니다. – Dan

+0

성능 튜닝은 매우 까다 롭습니다. 귀하의 하드웨어, 시스템 부하 등에 따라 다릅니다. 위의 "작은 배치"선택 : table1 t1, table2 t2를 업데이트 할 수 있습니다. SET t1.country = t2.country WHERE t1.email = t2.email LIMIT 10 –

+0

This 10 개의 레코드 만 업데이트합니다. 결과를 확인하십시오. 작동하는 경우 쿼리가 완료 될 때까지 기다려야합니다. –

관련 문제