주의사항
쿼리에 대해 필터링 한 조건이 없이 LEFT JOIN을 사용하기 때문에 왼쪽에 위치한 user 테이블의 모든 컬럼을 리턴한다.
select count(*) from user -> 30,000 rows
select count(*) from user_coupon -> 3,000 rows
select count(*) from user_coupon where coupone_id = 1 -> 1,000 rows
select count(*) from user_coupon where coupone_id = 2 -> 1,000 rows
select count(*) from user_coupon where coupone_id = 3 -> 1,000 rows
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.counpon_id=3
-> 30000 rows in set (0.04 sec)
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.counpon_id=3
-> 1000 rows in set (0.00 sec)
처리 방식
LEFT JOIN는 일관적으로 왼쪽의 테이블(outer table, driving table이라고 함)이 먼저 읽히게 된다. 따라서 조건이 없는 경우 user 테이블을 스캔하면서 counpon 테이블을 스캔한다
INNER JOIN은 쿼리순서가 명시된 테이블에 대해 처리순서가 보장된 것이 아닌, 옵티마이저에 의해 처리 순서가 변경된다.
count(*) + left join