b

7.4.6. JOIN 본문

RealMysql

7.4.6. JOIN

dev.bistro 2013. 1. 4. 20:07


7.4.6 JOIN


* JOIN의 순서와 인덱스

인덱스 탐색(Index seek) => 인덱스 스캔(Index scan) => 최종 레코드 Read


(일반적으로 가장 먼저 읽히는 테이블을 '드라이빙 테이블'이라 하고 가끔은 아우터 테이블을 드라이빙 테이블이라 하기도 한다)


- 드라이빙 테이블을 읽을 때는 '인덱스 탐색'1번 -> 스캔만 계속 실행

- 드리븐 테이블은 '탐색', '스캔'을 레코드 건수만큼 반복한다.

-- 그래서 1:1로 조인되더라도 드리븐 테이블을 읽는것이 훨씬 부하가 크다.

-- 그래서 옵티마이저는 '드리븐 테이블'을 최적으로 읽을 수 있게 최적화한다.



* JOIN 칼럼의 데이터 타입

- JOIN 에서도 각 칼럼의 타입이 일치하지 않으면 인덱스가 효율적이지 않다.


* OUTER JOIN의 주의사항

 OUTER로 조인되는 테이블의 칼럼에 대한 조건은 모두 ON 절에 명시해야한다.


* INNER JOIN과 OUTER JOIN의 선택

- INNER : 조인의 양쪽 테이블에 모두 존재하는 경우만 반환

- OUTER : OUTER에 존재하면 무조건 반환한다.

- OUTER가 느리다는 편견은 버려라, 성능의 차이는 거의 없다. 중요한것은 업무rule에 따라 선택하는것.


* FULL OUTER JOIN 구현

- MySQL은 FULL OUTER JOIN을 제공하지 않는다, 단 UNION으로 효과를 비슷하게 구현할 수 있다.

- 두 테이블을 OUTER 조인을 연결해서 UNION 으로 더하면 된다.

- UNION은 중복제거를 하기 때문에, 각 OUTER JOIN에서 중복을 제거하고 UNION ALL을 하면 좀 더 빠르다.


* 조인 순서로 인한 쿼리 실패

- MySQL은 ANSI 표준으로 INNER JOIN, LEFT JOIN을 제공한다 ANSI 표준에서는 반드시 JOIN 키워드의 좌우측에 명시된 테이블의 칼럼만 ON 절에 사용가능

- A-B-C순서로 INNER JOIN을 할 경우는 순서에 맞춰서 A-B ==> A or B - C 순으로 JOIN 해야한다.


* JOIN과 FOREIGN KEY

- FOREIGN KEY와 JOIN은 아무런 연관이 없다. FK의 주 목적은 무결성을 보장하기 위해서이다.



* 지연된 조인(Delayed Join)

- 지연된 조인이란 조인이 실행되기 전 GroupBy/OrderBy를 처리하는 방식을 의미(Limit가 특히 큰 효과)

- 할수있는 모든 수행을 다하고 마지막에 join을 하면 JOIN 횟수를 줄일 수 있다.


***  페이징에 관한 이슈 457 Page 꼭 참고할것 , 지연된 조인!***



Comments