반응형

JOIN

join이란?

  • 두 개 이상의 테이블을 연결하여 데이터를 검색하는 것을 말한다.
  • FROM절에 둘 이상의 여러 테이블이 나열되어 있어도 내부적으로는 두 테이블씩 조인을 수행한다.
  • 이 때 테이블 조인 순서는 Optimizer에 의해 결정되기 때문에 중요 튜닝 포인트이다.

EQUI JOIN

설명

  • 두 테이블 간의 칼럼값(도메인값)이 정확하게 일치하는 데이터를 조합하여 검색

INNER JOIN 예시

mysql> SELECT *
    -> FROM emp
    -> INNER JOIN dept
    -> ON emp.deptSeq = dept.deptseq;
+---------+--------+-------------+--------+---------------+---------+----------+
| deptSeq | empSeq | empName     | salary | managerEmpSeq | deptSeq | deptName |
+---------+--------+-------------+--------+---------------+---------+----------+
|       1 |      1 | developer-1 |    100 |             2 |       1 | develop  |
|       1 |      2 | developer-2 |    200 |          NULL |       1 | develop  |
|       2 |      3 | designer-1  |    150 |          NULL |       2 | design   |
+---------+--------+-------------+--------+---------------+---------+----------+

NATURAL JOIN 예시

  • 두 테이블 간의 동일한 이름과 타입을 갖는 모든 칼럼에 대해 join을 수행.
mysql> SELECT *
    -> FROM emp
    -> NATURAL JOIN dept;
+---------+--------+-------------+--------+---------------+----------+
| deptSeq | empSeq | empName     | salary | managerEmpSeq | deptName |
+---------+--------+-------------+--------+---------------+----------+
|       1 |      1 | developer-1 |    100 |             2 | develop  |
|       1 |      2 | developer-2 |    200 |          NULL | develop  |
|       2 |      3 | designer-1  |    150 |          NULL | design   |
+---------+--------+-------------+--------+---------------+----------+

NON-EQUI JOIN

설명

  • 두 테이블 간의 컬럼값 범위로 일치하는 경우 사용하는 방법.
  • BETWEEN, >=, <= 등을 사용하는 JOIN

예시

mysql> SELECT emp.empName, emp.salary, grade.grade
    -> FROM emp
    -> INNER JOIN grade
    -> ON emp.salary BETWEEN grade.minSalary AND grade.maxSalary;
+-------------+--------+-------+
| empName     | salary | grade |
+-------------+--------+-------+
| developer-1 |    100 | B     |
| developer-2 |    200 | A     |
| designer-1  |    150 | A     |
+-------------+--------+-------+

CROSS JOIN

설명

  • 생길 수 있는 모든 데이터의 조합으로 join을 수행.
  • ON 조건을 명시하지 않는다.

예시

mysql> SELECT *
    -> FROM emp
    -> INNER JOIN dept;
+---------+--------+-------------+--------+---------------+---------+----------+
| deptSeq | empSeq | empName     | salary | managerEmpSeq | deptSeq | deptName |
+---------+--------+-------------+--------+---------------+---------+----------+
|       1 |      1 | developer-1 |    100 |             2 |       1 | develop  |
|       1 |      2 | developer-2 |    200 |          NULL |       1 | develop  |
|       2 |      3 | designer-1  |    150 |          NULL |       1 | develop  |
|       1 |      1 | developer-1 |    100 |             2 |       2 | design   |
|       1 |      2 | developer-2 |    200 |          NULL |       2 | design   |
|       2 |      3 | designer-1  |    150 |          NULL |       2 | design   |
+---------+--------+-------------+--------+---------------+---------+----------+

SELF JOIN

설명

  • 하나의 테이블에서 두 개의 컬럼이 연관 관계를 가지고 있을 경우 사용하는 방법.
  • 하나의 테이블을 논리적으로 분리시켜 JOIN하는 방법.

예시

mysql> SELECT e1.empName AS 'senior', e2.empName AS 'junior'
    -> FROM emp e1
    -> INNER JOIN emp e2
    -> ON e1.empSeq = e2.managerEmpSeq;
+-------------+-------------+
| senior      | junior      |
+-------------+-------------+
| developer-2 | developer-1 |
+-------------+-------------+

NL(Nested Loops) Join

설명

  • 선행 테이블(Outer Table, Driving Table)에서 조건에 만족하는 레코드를 검색한 후, 후행 테이블(Inner Table, Driven Table)에서 결합 조건에 일치하는 레코드를 찾아 조인하는 방식.
  • 중첩 반복문과 유사한 방식으로 조인을 수행하는 기법
  • Random Access 방식으로 데이터를 읽는다.
  • 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋다.
  • 조인 조건에 해당하는 컬럼들은 인덱스를 가지고 있어야 한다.

수행 과정

  • 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾는다.
  • 선행 테이블의 조인 키와 일치하는 후행 테이블의 키가 있는지 확인한다.
  • 있으면 후행 테이블에 접근해 일치하는 정보를 조인하여 추출 버퍼에 넣는다.
  • 위 과정 반복한다.

Sort Merge Join

설명

  • 선행 테이블과 후행 테이블 모두 조인 컬럼을 기준으로 데이터를 정렬한 후 조인을 수행하는 기법이다.
  • Full Table Scan 방식으로 데이터를 읽는다.
  • Join 칼럼의 인덱스가 존재하지 않을 경우에도 사용 가능하다.
  • EQUI JOIN 뿐만 아니라 NON-EQUI JOIN에 대해서도 조인 작업이 가능하다.
  • 정렬할 데이터가 많을 경우 메모리에서 모든 작업을 수행하기 어려워 디스크를 사용할 수 있다. (성능 저하 발생할 수 있음)

수행 과정

  • 선행 테이블에서 조건을 만족하는 행을 찾는다.
  • 해당 행들을 조인 키 기준으로 정렬한다.
  • 후행 테이블에서 조건을 만족하는 행을 찾는다.
  • 해당 행들을 조인 키 기준으로 정렬한다.
  • 두 데이터를 JOIN하여 추출 버퍼에 넣는다.

Hash Join

설명

  • 조인 칼럼을 기준으로 Hash 함수를 적용하여 동일한 값이 존재할 때 JOIN을 수행하는 기법이다.
  • Hash 함수를 사용하여 일치하는 데이터를 찾는 방식이기 때문에 EQUI JOIN에서만 사용할 수 있다.
  • 선행 테이블 기준으로 Hash Table이 만들어지기 때문에 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋다.
  • Hash Table의 크기가 메모리보다 클 경우 디스크를 사용할 수 있다. (성능 저하 발생할 수 있음)

수행 과정

  • 선행 테이블에서 조건을 만족하는 행을 찾는다.
  • 해당 행들을 조인 키 기준으로 Hash 함수를 적용하여 해쉬 테이블을 생성한다.
  • 후행 테이블에서 조건을 만족하는 행을 찾는다.
  • 해당 행들을 조인 키 기준으로 Hash 함수를 적용하여 해쉬 테이블에 데이터가 있는지 확인한다.
  • 데이터가 존재하면 JOIN하고 추출 버퍼에 넣는다.

참고

반응형

'Development > MySQL' 카테고리의 다른 글

[MySQL] SQL_CACHE  (0) 2021.10.30
[MySQL] Lock  (0) 2021.02.26
[MySQL] Storage Engine  (0) 2020.12.29
[MySQL] Transaction Isolation Level  (0) 2020.12.29
[MySQL] 쿼리  (0) 2020.12.29

+ Recent posts