2014-04-24 3 views
-1

비효율적 인 쿼리를 실행하면 매우 큰 테이블 (이 테이블의 10 억 개가 넘는 행)에서 중복 된 행을 삭제하는 가장 효과적인 방법을 알 필요가 있습니다.이 작업을 수행하는 데 매우 효율적인 방법을 알 필요가 있습니다. . 내가 검색 테이블의 모든 중복 URL을 삭제해야 MySQL 큰 테이블에서 중복 행을 어떻게 삭제합니까?

,

DELETE FROM search WHERE (url) NOT IN 
(
SELECT url FROM 
(
SELECT url FROM search GROUP BY url 
) X 
); 
+2

** 관련 ** 질문에있는 답변과 다른 답변을 얻지 못할 것으로 생각됩니다. – Barmar

+0

현재 테스트 테이블에서이 응답을 테스트하는 데 걸리는 시간은 얼마입니까? – mahen3d

+0

@ mahen3d : 제안하는 쿼리는 테이블의 모든 행을 삭제합니다 ('url'이있는 행이없는 경우) 값이 NULL 인 경우) 또는 행을 삭제하지 않습니다 (NULL 값이 'url'인 행이있는 경우). 매우 큰 테이블의 경우 전체 시간뿐만 아니라 완료해야 할 작업량 (InnoDB의 잠금, 로깅 및 롤백). 행의 비율이 매우 큰 경우 새 테이블을 만들고 유지하려는 기존 테이블의 행만 복사하는 것이 좋습니다. 외래 키를 다시 만들어야하는 경우에도 대개 더 빠릅니다. – spencer7593

답변

0

은 인덱스에 전적으로 의존한다. 다음 두 단계로 수행하십시오. (1) 기본 키 또는 시간 소인 필드와 같은 URL을 가진 레코드를 구별 할 수있는 다른 필드와 결합 된 URL 필드에서 DBMS가 지원하는 최고 선택도 인덱스를 작성하십시오. (2) 한 번에 레코드와 커밋이 이러한 작은 배치를 초래하는 경우 작은 분수를 처리하기위한 절차 코드 (단순한 쿼리가 아닌)를 작성하십시오. PK mod 1000 또는 .TLD 부분 앞에있는 URL의 3 자로 슬라이스.

DB 프로세스가 메모리 부족, 로그 파일 공간 부족 등의 문제를 일으키지 않는 한 예측 가능한 결과를 얻을 수있는 최선의 방법입니다.

-1
DELETE from search 
where id not in (
    select min(id) from search 
    group by url 
    having count(*)=1 

    union 

    SELECT min(id) FROM search 
    group by url 
    having count(*) > 1 
) 
+1

이것이 도움이 될만한 이유에 대한 설명이 유용 할 것입니다. – Paddy

관련 문제