본문 바로가기
MySql

MySQL SQL 왼쪽 조인. 너무 오래 걸립니다.

by 베이스 공부 2020. 12. 27.
반응형

좋습니다. 여기 내 테이블 스키마가 있습니다.
I have 2 tables. Say Table A and Table B. The primary key of Table A is PriKeyA bigint(50) and primary key of Table B is PriKeyB varchar(255). Both PriKeyA and PriKeyB contain the same type of data.
The relevant fields of Table A required for this problem are Last_login_date_in_A (date) and Table B is the primary key itself.
What I need to do is, get those PriKeyA's in A which are not there in Table B's PriKeyB column and the Last_login_date_in_A column should be greater than 30 days from the current date. Basically I need the difference of Table A and Table B along with a certain condition(which is the date in this problem)
다음은 내 SQL 명령입니다.

: SELECT A.PriKeyA from A  
 LEFT JOIN B ON A.PriKeyA = B.PriKeyB   
 WHERE B.PriKeyB IS NULL and DATEDIFF(CURRENTDATE,Last_login_date_in_A)>30;

그러나이 MySQL 명령을 실행하면 엄청나게 긴 시간 (약 3 시간)이 걸립니다. 테이블 A의 크기는 2,50,000이고 테이블 B는 각각 42,000 개의 레코드입니다. PriKeyA와 PriKeyB가 다른 데이터 유형이기 때문에이 문제가 발생할 수 있다고 생각했습니다. 그래서 나는 또한 쿼리에서 CAST (PriKeyB as unsigned) 를 사용했습니다. 그러나 그것도 작동하지 않았습니다. 약간의 성능 향상이있었습니다.

가능한 문제는 무엇일까요? 이전에 Left Join을 사용해 보았지만 이렇게 오래 걸리지 않았습니다.

 

해결 방법

 

쿼리 비용은 다음과 같은 이유로 나타납니다.

이것이 의미하는 바는> 30 일 전 기준이 참인지 확인하기 위해 테이블 ​​A의 모든 행을 한 번에 한 행씩 검사해야한다는 것입니다. 이는 A에 250,000 개 대신 2,500,000 개의 행이있는 경우 (A의 행 수에 쉼표를 배치 한 방법에서 알 수 있듯이) 특히 그렇습니다.

Last_login_date_in_A에 인덱스를 추가하면 도움이 될 수 있지만 추가 인덱스를 업데이트해야하므로 테이블에 대한 삽입 / 업데이트 / 삭제 문 시간이 약간 느려집니다.


 

참조 페이지 https://stackoverflow.com/questions/17883981

 

 

반응형

댓글