삭제하려고 하는 테이블이 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