[MySQL] LEFT JOIN 주의사항 및 튜닝

기훈·2024년 7월 14일

MySQL

목록 보기
11/23

주의사항

  • 쿼리에 대해 필터링 한 조건이 없이 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

  • left join 쿼리에서 count를 사용하는 경우 left join이 굳이 필요하지 않다면 join은 제거한다.

0개의 댓글