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 이라고 합니다
- Slick이 다음과 같은 쿼리를 만들어줌 (난 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' 까지