mysql 중복제거 쿼리 질문입니니다. 채택완료

Copy
sql_query("DELETE A FROM g5_write_db A, g5_write_db B WHERE A.wr_id > B.wr_id AND A.wr_1 = B.wr_1");

 

전화번호를 ajax로 중복체크하였으나, 그럼에도 글을 남기는 사람들이 있더라구요ㅡ,,

 

그래서 

 

 

모든글이 써지고 해당 쿼리를 통해 중복번호를 지우고 최신 번호만 남겼었는데요..

 

db가 1000개가 넘어가니 시간이 상당히 오래 걸리네요....

 

이부분을 최적화 할수 있는 방법이 있을까요? ㅠㅠ

 

 

답변 1개

채택된 답변
+20 포인트

수행될때

full search 를 하기때문에 느려집니다.

 

빠르게 개선하려면

부분쿼리로 변경하되

조건이 index가 걸리도록 변경해야 빨라집니다.

 

먼저 g5_wirte_db 테이블에

 

wr_1 에 인덱스를 생성쿼리를 실행하시고,

 

create index write_db_wr1 on g5_write_db(wr_1);

 

위의 쿼리를 아래와 같이 변경해보세요

 

 

DELETE A FROM g5_write_db A

where exists (select 'x' from g5_write_db B

                 WHERE A.wr_id > B.wr_id

                    AND A.wr_1 = B.wr_1);

 

 

 


 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 5개

write_db_wr1 이것은 오타가 아니라 어떤 약속인가요? 아님 변수같은건가요?
변수와 같이 사용되는 db상의 닉네임 입니다.
https://dev.mysql.com/doc/refman/8.0/en/create-index.html

참고하세요
허허.. 쿼리가 실행된줄알앗는데,, 저말고 다른사람이 수동으로 지웠다고하네요.. 타이밍 좋게.. 쿼리가 실행된줄알았는데..

sql_query("create index write_db_wr1 on g5_write_db(wr_1) ");

sql_query("DELETE A FROM g5_write_db A where exists (select 'x' from g5_write_db B WHERE A.wr_id > B.wr_id AND A.wr_1 = B.wr_1)");


이렇게 적용했는데 실행이 안되나봐요..
@humanb2box
쪽지로 보내드렸듯이

삭제쿼리 자체는 문제가 없습니다.


create index는 db툴을 이용해서 혹은 터미널 창에서
db에 접속하셔서 직접 1회만 수행하시고

그외의

자유게시판을 예로
SELECT * FROM g5_write_free a
WHERE EXISTS (SELECT 'x' FROM g5_write_free b WHERE a.wr_id > b.wr_id AND a.wr_parent = b.wr_parent)

를 수행하면 정상적으로 잘 수행됩니다.

(당연히 어느정도 작성된 글은 있어야 확인 가능하겠죠)

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고