2012-10-31 4 views
4

비록이 문제가 과거에 제기되었지만 여전히 큰 (3M 및 증가) 테이블에서 중복 항목을 정리하는 가장 좋은 방법인지 궁금합니다. 각각의 벌크 인서트 (벌크 인서트) 후에는이 라인을 실행하여 깔끔하게 유지하지만, 실행하는 데는 오랜 시간이 걸리기 시작했습니다.MYSQL 중복 제거가 더 효율적입니까?

중복 행은 3 개의 열을 통해서만 결정될 수 있습니다. 나는이 속도를 높일 수

DELETE n1 
FROM main n1, main n2 
WHERE n1.id < n2.id 
AND n1.col1 = n2.col1 
AND n1.col2 = n2.col2 
AND n1.col3 = n2.col3 

모든 기회를, 또는이가수록 좋은 것입니다 - 다른 사람 자동 증가 하나,

여기

내가 현재 가고있는거야 등 uniqueIDs, 소스가?

도움/의견을 보내 주셔서 감사합니다.

+0

이 더 많은 중복 행을 방지하기 위해 고유 인덱스를 추가 할 수 없습니다 - 당신은 중복을 제거하려면

, 당신은이 쿼리를 사용할 수 있습니까? –

+0

정확히 어떻게 의미합니까? – user1145643

답변

2

col1, col2 및 col2 열의 테이블에 고유 한 인덱스를 이와 같이 추가하십시오.

ALTER TABLE `main` ADD UNIQUE INDEX `col1_col2_col3` (`col1`, `col2`, `col3`); 

이렇게하면 테이블에 중복 행이 삽입되지 않습니다.

예 : 이 값을 삽입하면; 당신은이를 삽입 할 수 없습니다

INSERT INTO `main` (`col1`, `col2`, `col3`) VALUES (1, 11, 111); 

, 당신은 중복 레코드 나중에 걱정하지 않아도 올바른 고유 인덱스와 중복 행 오류를

INSERT INTO `main` (`col1`, `col2`, `col3`) VALUES (1, 11, 111); 

을 얻을 것이다.

+0

흠 ... 여기에서 볼 수있는 유일한 문제는 이전 레코드를 대체하기 위해 새 중복 항목이 필요하다는 것입니다. 'WHERE n1.id user1145643

+0

흠 왜 삽입 대신 바꾸기를 사용하지 않으시겠습니까? replace는 insert와 거의 비슷합니다. 값이있는 행을 찾을 수 없으면 새 레코드를 삽입하고 현재 레코드를 삭제하고 새 레코드를 삽입합니다. 이것이 당신의 문제를 해결할 수 있습니까? http://dev.mysql.com/doc/refman/5.0/en/replace.html –

+0

이전의 레코드 ID가 필요하다면 replace는 이전의 레코드를 삭제하고 새로운 레코드를 삽입하므로 ID 필드 카운터가 변경됩니다. –

1

다른 포스터와 동의 - UNIQUE KEY를 제한 조건 중복에 추가 할 수 있습니다.

DELETE t1 FROM main t1 
    JOIN (SELECT MIN(id) id, col1, col2, col3 FROM main 
     GROUP BY col1, col2, col3) t2 
    ON 
    t1.id <> t2.id AND 
    t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3; 
관련 문제