[MySQL] != 처럼 JOIN 하기

2021. 12. 29. 18:31개인 공부 공간/SQL

최근 두 테이블 JOIN 시 아래 벤다이어그램과 같은 결과가 나오도록 쿼리문을 작성할 일이 있었다.

 

원래 어떻게 작성하면 위와 같은 결과가 나오는지 알고 있었는데.. 멍청하게도 JOIN ON 조건에 != 를 사용했다.

부끄럽지만 실수로 작성한 쿼리문을 공개하면 다음과 같다.

SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b
ON a.key != b.key;

쿼리문 실행 후 아무리 기다려도 결과가 나오지 않아 이상함을 느낀 후 생각해보니 아주 잘못된 방식으로 쿼리문을 작성했음을 깨달았다.

위 쿼리문이 안되는 정확한 이유를 알기 위해 구글링 해보니 다음과 같은 이유로 위 쿼리문은 엄청난 연산 과정을 거친다고 한다.

 

LEFT JOIN이 table a의 1,000,000개 행 중 75%를 반환한다고 가정하고 일치 하지 않는 250,000개의 다른 행을 사용자의 의도대로 반환하지 않는다. 대신 곱 집합(Cartesian product 을 만들고 750,000개의 일치하는 행을 제거하려고 합니다. 따라서 6,000,000×1,000,000-750,000개의 행을 연산 하여 반환하려고 합니다.

 

쉽게 얘기하면 엄청나게 불필요한 연산 과정이다.

 

위 벤다이어그램과 같은 결과를 얻기 위해서는 아래와 같이 쿼리문을 작성해야 한다.

SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b
ON a.key = b.key
WHERE b.key IS NULL;

References

출처: https://privatedevelopnote.tistory.com/81 [개인노트]