콘텐츠로 이동

2023 12 14

2023-12-14

MySQL Implicit JOIN

  • 개요
    • Implicit Join: From 절에는 table만 나열하고, where 절에 join condition을 명시하는 방식
  • SELECT 쿼리에서 테이블 두개를 ,로 불러온다는 것
    • SELECT * FROM category, bulletin;
    • Join 조건을 명시적으로 주지 않고, FROM 절로 두 테이블을 불러오면 카테시안 곱(cross join)의 결과를 가져옴
      • 카테시안 곱은 두 테이블의 모든 조합을 가져옴
      • category rows * bulletin rows 만큼의 rows 수를 반환
    • 의도적으로 해당 쿼리를 쓰는 것이 아니라면, explicit join을 쓰는 것을 더 추천함
  • Implicit JOIN

    • Slick이 다음과 같은 쿼리를 만들어줌 (난 Join으로 썻는데, 최적화를 이렇게 함)
      select 
          x2.`id`, x2.`category_id`, x2.`title`, x2.`content`, x2.`status`, x2.`pin`, x2.`popup`, x2.`popup_start_at`, x2.`popup_end_at`, x2.`display_start_at`, 
          x2.`created_at`, x2.`created_by`, x2.`modified_at`, x2.`modified_by` 
      from `bulletin` x2, `bulletin_display_service_type_mapping` x3 
      where (
              ((((x2.`status` = 'A') and (x2.`category_id` = 565)) and (x2.`display_start_at` <= '2023-12-14 02:27.17.844')) and (x3.`service_type` in (?))) and (x2.`title` like '%이미지%')
          ) and (x2.`id` = x3.`bulletin_id`) 
      order by x2.`pin` desc, x2.`display_start_at` desc 
      limit 0,10
      
    • 이때, from 'bulletin' x2, 'bulletin_display_service_type_mapping' x3에서 카테시안 곱이 발생함
    • 하지만 where 절을 보면 x2.id = x3.bulletin_id 조건이 있는데...
      • 이게 JOIN의 ON절과 동일한 역할을 해
      • 결과를 결국 이게 첫번째 테이블의 id를 두번째 테이블의 bulletin_id 와 매칭하는거만 뚝딱 결합 하도록
      • 이걸 implicit JOIN 이라고 합니다
  • Implicit JOIN 왜 씀?
    • 몇몇 경우에는 explicit JOIN 보다 효율적일 수 있음
    • 사실 쿼리를 뭘 날리더라도 데이터베이스 시스템이 최적화해서 꽤나 효율적으로 최적화해줄거야
      • 이 과정에서 implicit join을 동일한 explicit join으로 변경할 수도 있고 (역도 마찬가지)
    • 그게 결국 1차적으로는 명시적으로 JOIN 쿼리를 써주는것이 유지보수 입장에서도 좋아. 가독성도 그렇고.
      • 그런 다음에 DB가 최적화를 담당하도록 하는게 좋음

MySQL DATETIME vs DATETIME(3)

  • DATETIME
    • '1000-01-01 00:00:00' 부터 '9999-12-31 23:59:59' 까지
  • DATETIME(3)
    • microsecond 3자리까지 저장
    • '1000-01-01 00:00:00.000' 부터 '9999-12-31 23:59:59.999' 까지