2017-11-06 1 views
1

테이블의 각 user_id (그룹)에 대해 각 그룹에서 가장 높은 ID를 가진 레코드를 제외한 모든 레코드를 삭제하려고합니다. 표가 불가능 성능 될 것 같은 단일 쿼리에이 일을, 100 개 + MILLON 기록을 보유하고중복 레코드 삭제 반복

DELETE FROM logins 
WHERE user_id IS NOT NULL AND id NOT IN (SELECT MAX(id) FROM logins WHERE user_id IS NOT NULL GROUP BY user_id) 

문제는 다음과 같습니다과 유사한 뭔가 : 같은 Delete all records except the most recent one?

내 경우에는 그것은 보일 것 슬기로운.

내가 할 수있는 다른 방법은 무엇입니까? 일부 배치에?

답변

0

I 구문에 기울어 될 delete로이 쉽게 logics(user_id, id)에 인덱스를 활용할 수 있습니다

DELETE FROM logins l 
    WHERE l.user_id IS NOT NULL AND 
      l.id <> (SELECT MAX(l2.id) 
        FROM logins l2 
        WHERE l2.user_id = l.user_id 
       ); 

. 이 방법을 가지고가는 경우에

create table temp_logics as 
    select l.* 
    from logins 
    where l.id = (SELECT MAX(l2.id) 
        FROM logins l2 
        WHERE l2.user_id = l.user_id 
       ); 

truncate table logins; 

insert into logins 
    select * from temp_logins; 

가, 두 번째 테이블을 절단하기 전에 temp_logins을 확인하십시오 : 당신이 행을 많이 삭제하는 경우,이 테이블을 절단하고 다시하는 것이 좋습니다. 실제로 중간 테이블에 임시 테이블을 사용하고 싶지는 않습니다. 데이터베이스에 문제가 생길 수 있고 데이터를 잃어 버릴 수 있기 때문입니다.

+0

첫 번째 쿼리가 내 것과 동일하게 수행되고 있습니까 (각 user_id 그룹에 대해 가장 큰 ID 유지)? 또한 한 번에 백만 개의 레코드를 삭제하는 데 적합할까요? –

+0

@NielsKristian. . . 첫 번째 것은 모든 'user_id'에 대해 가장 큰 ID를 제외하고 모두 삭제됩니다. –

+0

감사합니다. 대량의 데이터를 일괄 적으로 삭제했습니다. 그런 다음 첫 번째 쿼리를 실행하여 + 2m 행에 대해 정상적으로 작동했습니다. –