mysql 대략 3억건의 row가 있는 테이블에서 2억5천만건을 삭제 하려고 합니다 0 0 747

by 토마톰 [MySQL] [2021.02.26 10:49:05]


삭제하려고 하는 테이블이 A이고 B라는 테이블과 join을 해서 같은 시간 (ymd)에 같은 media_id를 갖고있는있는경우를 제외하고 삭제하려고 합니다.
그래서 A과 B를 Ymd, media_id 로 조인을 하고 나온 seq를 A테이블에서 not in 하여 삭제 하려고 하는 중이라고 봐주시면 될것같습니다.

아래 쿼리는 작성한 삭제 예정 data row를 뽑는 쿼리입니다.
범위를 정해서 나누어 삭제를 하고자 A테이블에 seq컬럼(PK) 으로 range를 걸어둔 상태입니다 근데 시간이 너무 오래걸려서 문의 드리고자 글을 쓰게 됐습니다.

아래 쿼리를 explain 했을때의 결과는 아래와 같습니다 (summaryMedia = A , media = B)
인덱스 문제라고 봐야할지 아니면 쿼리가 문제라면 어느방향으로 수정을 해야할지 조언좀 부탁드리겠습니다.

감사합니다

1 SIMPLE summaryMedia   range PRIMARY,idx_seq_mId_dh_for_migrate PRIMARY 4   1085158 100.00 Using where
1 SIMPLE summaryMedia   eq_ref PRIMARY,idx_mediaId_date,idx_mediaId_date_aId,idx_datehh,idx_mId_datehh_seq,idx_seq_mId_dh_for_migrate PRIMARY 4 cindi_summary.summaryMedia.seq 1 100.00 Using where
1 SIMPLE media   ref mediaId_idx,ids_idx,idx_media_media_id ids_idx 203 cindi_summary.summaryMedia.media_id 184 100.00 Using where

SELECT L.*
FROM (
	select *
	from A
    WHERE seq >= 0
    AND seq < 500000
) L LEFT OUTER JOIN (
	select A.seq
	from (
		select seq, media_id, date
		from A
        WHERE seq >= 0
        AND seq < 500000
	) A JOIN (
		select media_id, date		
                from B
	) B ON (A.media_id = B.media_id AND A.date= B.date)
) R ON (L.seq = R.seq)
WHERE R.seq IS NULL

 

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입