[참조사이트]
https://superman28.tistory.com/23
[JOIN 종류]
예제 테이블
mysql> select * from demo_people;
name | phone | pid |
Mr brown | 01225 708225 | 1 |
Miss Smith | 01225 899360 | 2 |
Mr Pullen | 01380 724040 | 3 |
mysql> select * from demo_property;
pid | spid | selling |
1 | 1 | Old House Fram |
3 | 2 | The Willows |
3 | 3 | Tali Trees |
3 | 4 | the Melksham Florist |
4 | 5 | Dun Roamin |
1. 기본 JOIN (= INNER JOIN)
- 기본적으로 JOIN은 교집합이다.
2. LEFT JOIN
OUTER JOIN에는 두 가지 요소가 있다.
1. OUTER JOIN의 기준이 되는 테이블
2. OUTER JOIN의 기준이 아닌 테이블
본 쿼리에서 기준 테이블은 demo_people이고 기준이 아닌 테이블은 demo_property이다.
demo_people를 기준으로 demo_property를 확장해라는 뜻이다.
- 왼쪽 테이블을 중심으로 오른쪽의 테이블을 매치시킨다.
- 왼쪽 테이블의 한개의 레코드에 여러개의 오른쪽 테이블 레코드가 일치할 경우,
해당 왼쪽 레코드를 여러번 표시하게 된다.
- 왼쪽은 무조건 표시하고, 매치되는 레코드가 오른쪽에 없으면 NULL을 표시한다.
[ ON절의 의미]
ON절의 용도
1. 조인 대상 필터링
2. 연관 고나계없는 엔티티 외부조인
ON에 조건을 거는 것은 애초에 시작이 다르다.
간단한 예시로 ON절에 조건을 주면, 테이블을 합칠 때 조건이 걸려서 하나의 가상테이블(join된 결과)이 만들어진다.
그와 반대로 WHERE절에 조건이 걸리면, 다 만들어진 테이블을 다시 훑으면서 해당 조건에 맞는 결과물을 반환한다.
이는 OUTER JOIN에서 확연하게 차이를 보인다.
결론 : 조인 테이블에 대한 조건은 WHERE보다 ON을 통해서 필터링하는 것이 성능을 최적화할 수 있는 방법이다.
이유 : ON을 사용할 경우 테이블들이 조인되기 전에 조건문을 수행한다. 반면에 WHERE 절은 테이블들이 조인된 후에
조건문이 수행되기에 더 많은 데이터를 필터링해야한다. 그러므로 성능을 저하시킬 수 있다.
※참고사항
> on은 outer join에 속한다 (공통되는 컬럼이 아니여도 같이 조인된다)
> Inner Join의 경우 ON, Where 성능 차이는 크게 없으나, Outer Join의 데이터가 많으면 많을수록 큰 효과를 볼 수 있다.
(inner Join은 애초에 매핑된 값을 가져오기에, on을 하든 where를 하든 성능/조회상 차이가없다)
> outer Join의 경우, on절을 사용할 시 테이블이 조인되기 전에 조건문을 수행하여 기존에 가져와야할 모든 정보가 아닌, 필터링되어 추려진 정보만을 갖고온 채 조인하게되어 효율이 상승한다. (이는 outer join 데이터가 많을 수록 효과가크다)
[Query 조회기능 최적화 팁]
Join 되는 결과 테이블의 크기를 줄여야 한다.
=> JOIN시 on절에 의해 추려지는 데이터는 메모리에서 관리하게 되므로, on으로 추릴 때 이왕이면 데이터의 중복이나, 양을 최대한 줄일 수 있도록 설정해야 성능에 도움이 된다.
=>그래서 Left outer join 보다는 inner join을 사용하자
같은 데이터를 뽑아낼 거면 Left outer join으로 null로 join 되는 걸 가져온 후 다시 제외하는 것보다,
한 번에 inner join을 사용하는 게 성능상 좋다.
'Spring' 카테고리의 다른 글
Querydsl 관련정보 (0) | 2022.11.21 |
---|---|
페치조인 (Fetch Join) (0) | 2022.11.07 |
Elasticsearch란? (작성중) (0) | 2022.11.05 |
ExceptionHandler / ControllerAdvice 사용법 (0) | 2022.11.03 |
WebSocket / STOMP (1) | 2022.10.28 |
댓글