2011-05-05 2 views
2

두 개의 MySQL 테이블 t1과 t2가 각각 1M과 15M 로우입니다. 표 t1은 'tel'와 t2의 필드가 하나 뿐이지 만 'tel'필드도 있습니다. 내가 뭘 원하는 매우 간단합니다 :두 개의 큰 MySQL 테이블에서 일치하는 레코드 삭제

DELETE FROM t1 WHERE t1.tel IN (SELECT tel FROM t2) 

문제는이 쿼리가 완료되지 것이다 : T2에 존재 T1의 모든 행을 삭제합니다. 나는 그것을 8 코어 Xeon 워크 스테이션에서 돌리고 2 일 후에 그것을 멈추고 대안을 찾기로 결정했다. 나는 또한 새로운 테이블 (tt1)을 만들고 LE1 OUTER JOIN을 사용하여 t1에없는 t2의 행만 삽입하려고 시도했지만 동일한 시간이 걸릴 것으로 보인다. t1의 'tel'필드는 기본 키이며 t2의 고유 키입니다 (또한 t2 (tel)에 INDEX t2tel을 작성했지만 도움이되지 않았습니다).

의견이 있으십니까? 순서가 지정된 배열이나 해시로 두 테이블을 모두로드하고 코드를 통해 C# 프로그램을 작성하는 것을 고려하고 있습니다 ... 미리 감사드립니다.

답변

3
DELETE t1 
    FROM t1 
INNER 
    JOIN t2 
    ON t1.tel = t2.tel; 

하위 쿼리를 사용할 때보 다 훨씬 빠릅니다. 이미 최적화되지 않은 경우, 큰 테이블을 위해 MySQL 인스턴스를 최적화하기 위해 취할 수있는 많은 단계가 있습니다. 충분한 키 버퍼가 좋은 시작입니다. 다른 단계가 많이 있습니다. Google 성능 최적화를 위해 Google for Google을 사용하는 것이 가장 좋습니다.

+0

또한 http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/0596101716. 최고의 MySQL 성능 리소스. –

0

성능과 함께이 문제를 내가 쿼리 내부 쿼리를 사용하면보다 효율적으로 사용 조인, 나는이 간단하고 작은 테이블과 테스트를했고, 나는이 사용하기 때문에이 생각 :

DELETE t1 FROM t1 inner join t2 on t1.id = t2.t1_id; 

그것은 나를 위해 일했습니다. 나는 이것이 당신을 도울 수 있기를 바랍니다.