티스토리 뷰
조인
하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것을 말한다.
MySQL에서는 JOIN, MongoDB에서는 lookup이라는 쿼리로 처리한다.
MongoDB에서는 조인 연산에 대해 관계형 데이터베이스보다 성능이 떨어지기 때문에 사용을 지양한다.
따라서 여러 테이블을 조인하는 작업이 많은 경우 MongoDB보다는 관계형 데이터베이스를 써야 한다.
내부 조인 (inner join)
왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행이 있는 부분만 표기한다.
SELECT * FROM TableA A
INNER JOIN TableB B ON
A.key = B.key
왼쪽 조인 (left outer join)
왼쪽 테이블의 모든 행이 결과 테이블에 표기된다.
테이블 B의 일치하는 부분의 레코드와 함께 테이블 A를 기준으로 완전한 레코드 집합을 생성한다.
만약 테이블 B에 일치하는 항목이 없으면 해당 값은 null 값이 된다.
SELECT * FROM TableA A
LEFT JOIN TableB B ON
A.key = B.key
오른쪽 조인 (right outer join)
오른쪽 테이블의 모든 행이 결과 테이블에 표기된다.
테이블 A의 일치하는 부분의 레코드와 함께 테이블 B를 기준으로 완전한 레코드 집합을 생성한다.
만약 테이블 A에 일치하는 항목이 없으면 해당 값은 null 값이 된다.
SELECT * FROM TableA A
RIGHT JOIN TableB B ON
A.key = B.key
합집합 조인 또는 완전 외부 조인 (full outer join)
두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기한다.
양쪽 테이블에서 일치하는 레코드와 함께 테이블 A와 테이블 B의 모든 레코드 집합을 생성한다.
이 때 일치하는 항목이 없으면 누락된 쪽에 null 값이 포함되어 출력된다.
SELECT * FROM TableA A
FULL OUTER JOIN TableB B ON
A.key = B.key
조인의 원리
중첩 루프 조인 (NLJ, Nested Loop Join)
중첩 for문과 같은 원리로 조건에 맞는 조인을 하는 방법이며, 랜덤 접근에 대한 비용이 많이 증가하므로 대용량의 테이블에선 사용하지 않는다.
예를 들어 t1, t2 테이블을 조인한다고 했을 때 첫 번째 테이블에서 행을 한 번에 하나씩 읽고 그 다음 테이블에서도 행을 하나씩 읽어 조건에 맞는 레코드를 찾아 결괏값을 반환한다.
for each row in t1 matching reference key {
for each row in t2 matching reference key {
if row satisties join conditions, send to client
}
}
정렬 병합 조인
각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인이다.
조인할 때 쓸 적절한 인덱스가 없고 대용량의 테이블들을 조인하고 조인 조건으로 <, > 등 범위 비교 연산자가 있을 때 쓴다.
해시 조인
해시 테이블을 기반으로 조인하는 방법이다. 두 개의 테이블을 조인한다고 했을 때 하나의 테이블이 메모리에 온전히 들어간다면 보통 중첩 루프 조인보다 더 효율적이다. 또한 동등(=) 조인에서만 사용할 수 있다.
Reference
- Total
- Today
- Yesterday
- 연관매핑
- 정렬병합조인
- 직접연관매핑
- 메모리 계층
- 클러스터형인덱스
- 디자인 패턴
- 자바
- 스레드
- 캐시매핑
- 보이스코드정규형
- 세컨더리인덱스
- 직접매핑
- 네트워크 기초
- Design Pattern
- 대수확장성
- 프로세스
- 인덱스최적화
- 불연속할당
- 중첩루프조인
- 프로그래밍
- 프로세스와 스레드
- 프로세스 컴파일
- 스프링 WebFlux
- 선언형 프로그래밍
- java
- 프로그래밍 패러다임
- 코틀린
- 네트워크
- 함수형 프로그래밍
- 스프링 R2DBC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |