ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DB - EXPLAIN 실행계획 조인 방식에 대해
    DB 2025. 10. 1. 16:00

    1. Nested Loop Join (NLJ, 중첩 루프 조인)

    동작방식: 외부 테이블의 각 행마다 내부 테이블을 검색

    특징 :

     1. 작은 테이블 vs 큰 테이블일 때 자주 사용

     2. 인덱스가 걸려있으면 빠름

     3. 인덱스가 없으면 내부 테이블 풀스캔 -> 성능 저하

    EXPLAIN 에서 표시

     type=ref, type=eq_ref, type=ALL (조건에 따라)

     

    2. Hash Join

    동작방식 : 한쪽 테이블을 해시테이블에 올려두고 다른 테이블과 매칭

    특징 :

     1. 대량 데이터 조인시 효과적

     2. 인덱스 없어도 잘 동작.

     3. PostgreSQL, Oracle에서 많이 사용. Mysql은 8.0 부터 지원

    EXPLAIN에서 표시

     Mysql 8.0+: hash join 표기됨

     

    3. Merge Join (Sort-Merge Join)

    동작방식 : 두 테이블을 각각 정렬 후 머지(merge)하면서 매칭.

    특징 :

     1. 정렬 비용 있음.

     2. 이미 정렬된 상태(인덱스 순서)라면 효율적

    EXPLAIN에서 표시

     PostgreSql/oracle에서 주로 확인가능, Mysql에서는 거의 사용안함

     

    4. Block Nested Loop Join (BNLJ)

    동작방식: 외부테이블을 블록 단위로 읽어 내부 테이블과 비교.

    특징 : 

     1. 인덱스가 없어도 사용할수있음

     2. 메모리 사용량 증가

     Mysql Explain

       type=ALL + Extra에 Using join buffer (Block Nested Loop)가 표시됨

     

    5. Index Nested Loop Join (INLJ)

    동작방식: Nested Loop Join인데 내부 테이블 탐색 시 인덱스를 활용

    특징 : 

     1. 인덱스 있으면 성능 좋음

     2. 조인 조건이 인덱스를 잘 타는 경우에만 사용

    EXPLAIN

     ref or eq_ref 유형

     

    6. Semi Join / Anti Join

    동작방식 : EXISTS, IN, NOT EXISTS, NOT IN 같은 서브쿼리 최적화 시 등장.

    특징 : 

      1. 조건을 만족하는 첫 행만 찾으면 된다는 경우 Semi Join 사용

      2. 조건을 만족하지 않는 경우 찾는다면 Anti Join 사용

    Mysql EXPLAIN

      DEPENDENT SUBQUERY 최적화 시 보일수 있음

     

    요약 : 

     작은테이블 + 인덱스 있음 -> Nested Loop Join

     큰테이블 + 인덱스 없음 -> Hash Join

     이미 정렬된 상태 -> Merge Join

     인덱스 없고 큰 테이블 -> Block Nested Loop Join

Designed by Tistory.