LEFT JOIN 주의사항 & 튜닝

 

1. 들어가며

쿼리를 짜며 INNER JOIN 혹은 LEFT JOIN은 사용할 일이 자주 있습니다. 둘의 차이는 널리 알려져 있고 헷갈리는 경우는 별로 없는데요.

 

다만 LEFT JOIN의 경우 오용하는 경우도 많고, 속도 면에서 디메리트가 크기 때문에 짚고 넘어갈 필요가 있습니다.

 

2. LEFT JOIN

정의: 쉽게 생각하면 왼쪽 테이블이 주인공이 되는 조인입니다. 둘 중 한쪽 테이블을 기준으로 LEFT 또는 RIGHT JOIN을 할 경우, 그 기준이 되는 테이블의 모든 레코드를 출력하게 됩니다.

예를 들어 다음과 같은 테이블이 있다고 해볼까요

CREATE TABLE user (
  id int NOT NULL AUTO_INCREMENT,
  name varchar(20) NOT NULL,
  ...
  PRIMARY KEY (id)
);

CREATE TABLE user_coupon (
  user_id int NOT NULL,
  coupon_id int NOT NULL,
  ...
  PRIMARY KEY (user_id, coupon_id)
  KEY ix_couponid (coupon_id)
);

 

우리는 여기서 전체 유저 목록은 나오되, 3번 쿠폰을 가진 경우 추가 정보를 가져오고자 합니다.

SELECT u.id, u.name, uc.coupon_id, uc.use_yn
FROM user u
LEFT JOIN user_coupon uc ON uc.user_id=u.id AND uc.coupon_id=3

 

이때 위와 같이 LEFT JOIN을 사용하면 예상대로 동작하게 됩니다.

하지만 ON 절에 있는 조건을 WHERE 절로 이동시키면 어떻게 될까요?

SELECT u.id, u.name, uc.coupon_id, uc.use_yn
FROM user u
LEFT JOIN user_coupon uc ON uc.user_id=u.id
WHERE uc.coupon_id=3

이럴 경우

  • ON 조건에 명시되면 join 연결 조건인데,
  • where 조건은 전체 데이터의 필터링으로 동작하기 때문에

WHERE의 조건이 맞는 row만 쿼리해오게 됩니다. 즉 이 차이를 명확히 인지하고 사용해야 합니다. 여담으로 optimizer가 위 쿼리를 실행하면 INNER JOIN으로 동작하게 됩니다.

 

LEFT JOIN VS INNER JOIN 동작

  • left join 왼쪽을 driving table 오른쪽을 driven table이라고 합니다.
  • left join은 왼쪽이 항상 먼저 읽히게 됩니다.
  • 반면에 inner join의 경우 동일한 순서로 from 절에 나열되어도 실제로는 뒤에 table을 먼저 읽을 수 있습니다.
  • 효율적인 처리를 위해 인덱스가 있는 table을 먼저 접근해 처리하는 것을 알 수 있습니다.

LEFT JOIN 쿼리에서 COUNT를 사용하는 경우 LEFT JOIN이 굳이 필요하지 않을 때가 있으니 그럴 땐 최적화를 위해 사용하지 않는 것이 좋겠습니다.