본문 바로가기
TIL/CS

조인

by J1-H00N 2023. 10. 25.

조인이란 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것을 말한다.

MySQL에서는 JOIN이라는 쿼리로, MongoDB에서는 lookup이라는 쿼리로 이를 처리할 수 있다.

참고로 MongoDB를 사용할 대 lookup은 되도록 사용하지 말아야 한다. 관계형 데이터베이스보다 성능이 떨어진다고 여러 벤치마크 테스트에서 알려져 있기 때문이다. 따라서 여러 테이블을 조인하는 작업이 많을 경우 MongoDB보다는 관계형 데이터베이스를 써야 한다.

 

  • 조인의 종류
    • 내부 조인 - 왼쪽 테이블과 오른쪽 테이블 두 행이 모두 일치하는 행이 있는 부분만 표기한다. 두 테이블 간의 교집합이다.
    • 왼쪽 조인 - 왼쪽 테이블의 모든 행이 결과 테이블에 표기된다.
    • 오른쪽 조인 - 오른쪽 테이블의 모든 행이 결과 테이블에 표기된다.
    • 합집합 조인 - 두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기한다. 두 테이블 간의 합집합이다.
  • 조인의 원리
    • 중첩 루프 조인
      • 중첩 for 문과 같은 원리로 조건에 맞는 조인을 하는 방법이며, 랜덤 접근에 대한 비용이 많이 증가하므로 대용량의 테이블에서는 사용하지 않는다.
      • 중첩 루프 조인에서 발전한 조인한 테이블을 작은 블록으로 나눠서 블록 하나씩 조인하는 블록 중첩 루프 조인이라는 방식도 있다.
    • 정렬 병합 조인
      • 각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 후 조인 작업을 수행하는 조인이다.
      • 조인할 때 쓸 적절한 인덱스가 없고 대용량의 테이블들을 조인하고 조인 조건으로 <,> 등 범위 비교 연산자가 있을 때 쓴다.
    • 해시 조인
      • 해시 테이블을 기반으로 하는 조인이다.
      • 두 개의 테이블을 조인한다고 했을 때 하나의 테이블이 메모리에 온전히 들어간다면 보통 중첩 루프 조인보다 더 효율적이다.
      • 메모리에 올릴 수 없을 정도로 크다면 디스크를 사용하는 비용이 발생된다.
      • 동등(=) 조인에서만 사용할 수 있다.
      • MySQL의 해시 조인은 빌드 단계, 프로브 단계로 나뉜다.
        • 빌드 단계
          • 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계이다.
          • 조인에 사용되는 필드가 해시 테이블의 키로 사용된다.
        • 프로브 단계
          • 이 단계 동안 레코드 읽기를 시작하며, 각 레코드에서 키로 사용되지 않은 필드의 아이디에서 해시 테이블을 기반으로 일치하는 레코드를 찾아서 결괏값으로 반환한다.
          • 이를 통해 각 테이블은 한 번씩만 읽게 되어 중첩해서 두 개의 테이블을 읽근 중첩 루프 조인보다 보통은 성능이 좋다.
          • 사용 가능한 메모리양은 시스템 변수 join_buffer_size에 의해 제어되며, 런타임 시에 조정될 수 있다.

'TIL > CS' 카테고리의 다른 글

자료구조  (0) 2023.10.31
데이터베이스의 종류/ 인덱스  (0) 2023.10.25
트랜잭션과 무결성  (0) 2023.10.25
ERD와 정규화 과정  (0) 2023.10.24
데이터베이스  (0) 2023.10.24