[면접을 위한 CS 전공지식 노트] 데이터베이스 - 조인

Yijun Jeon·2024년 2월 7일
0

CS 전공지식

목록 보기
21/21
post-thumbnail

💡 데이터베이스 란?

데이터베이스(DB, Database)는 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음

  • 실시간 접근과 동시 공유 가능

조인

💡 조인 (join) 이란?

두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것

  • MySQL : JOIN 쿼리
  • MongoDB : lookup 쿼리

참고 : MongoDB의 lookup 연산은 관계형 데이터베이스 조인 연산보다 성능이 떨어지므로, 여러 테이블을 조인하는 작업이 많을 경우 관계형 데이터베이스 사용

조인의 종류

내부 조인

💡 내부 조인 (inner join) : 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행이 있는 부분만 표기

  • 두 테이블 간에 교집합을 나타냄
SELECT * FROM TableA A
INNER JOIN TableB B ON A.key = B.key

왼쪽 조인

💡 왼쪽 조인 (left outer join) : 왼쪽 테이블의 모든 행이 결과 테이블에 표기

  • 오른쪽 테이블에 일치하는 항목이 없으면 해당 값은 null 값이 됨
SELECT * FROM TableA A
LEFT JOIN TableB B ON A.key = B.key

오른쪽 조인

💡 오른쪽 조인 (right outer join) : 오른쪽 테이블의 모든 행이 결과 테이블에 표기

  • 왼쪽 테이블에 일치하는 항목이 없으면 해당 값은 null 값이 됨
SELECT * FROM TableA A
RIGHT JOIN TableB B ON A.key = B.key

합집합 조인

💡 합집합 조인 (full outer join) : 두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기

  • 일치하는 항목이 없으면 누락된 쪽에 null 값이 포함되어 출력
SELECT * FROM TableA A
FULL OUTER JOIN TableB B ON A.key = B.key

조인의 원리

중첩 루프 조인

💡 중첩 루프 조인 (NLJ, Nested Loop Join) 이란?

중첩 for 문과 같은 원리로 조건에 맞는 조인을 하는 방법

  • 랜덤 접근에 대한 비용이 많이 증가하므로 대용량의 테이블에서는 사용하지 않음

🔗 의사 코드 예시

for each row in t1 matching reference key {
    for each row in t2 matching reference key { 
        if row satisfies join conditions, send to client 
    }
}

⭐️ 중첩 루프 조인에서 발전한 블록 중첩 루프 조인(BNL, Block Nested Loop) 방식도 있음

  • 조인할 테이블을 작은 블록으로 나눠서 블록 하나씩 조인

정렬 병합 조인

💡 정렬 병합 조인 이란?

각각의 테이블을 조인할 필드 기준으로 정렬하고, 정렬이 끝난 이후에 조인 작업을 수행하는 조인

  • 조인할 때 쓸 적절한 인덱스가 없을 때
  • 대용량의 테이블을 조인할 때
  • 조인 조건으로 < , > 등 범위 비교 연산자가 있을 때

해시 조인

💡 해시 조인 이란?

해시 테이블을 기반으로 조인하는 방법

  • 하나의 테이블이 메모리에 온전히 들어간다면 보통 중첩 루프 조인보다 더 효율적임
  • 동등(=) 조건에서만 사용 가능

❗️ MySQL의 해시 조인 단계는 빌드 단계, 프로브 단계로 나뉨

빌드 단계 : 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계

  • 바이트가 더 작은 테이블을 기반으로 해서 테이블을 빌드
  • 조인에 사용되는 필드가 해시 테이블의 키로 사용됨

프로브 단계 : 레코드 읽기를 시작하며, 각 레코드에서 특정 값에 일치하는 레코드를 찾아서 결과값으로 반환하는 단계

이를 통해 각 테이블은 한 번씩만 읽게 되어 중첩해서 두 개의 테이블을 읽는 중첩 루프 조인보다 보통은 성능이 더 좋다. 참고로 사용 가능한 메모리양은 시스템 변수 join_buffer_size 에 의해 제어되며, 런타임 시에 조정할 수 있다.

0개의 댓글