반응형
Join
- 두 테이블을 합치는 과정
- 대부분 정규화를 거치게 되면 1:N(OneToMany/ManyToOne), 1:1(OneToOne)관계를 가지게 됩니다.
- 이런 연관관계를 DB측에서는 relation관계라고 표현합니다.
Join 방식
Nested Loop방식
- mysql이 많이 사용하는 방식
- 8.0.18버전 이전에는 mysql 의 유일한 join 방식입니다
- 먼저 처리될 table(drivinig table)의 row수가 작을 수록 성능적인 이점을 가져갑니다
- 이유
- nested loop에서는 index가 없을 경우 2중 for문 처럼 조회 하게 됩니다. 만약 driving table의 row가 커질 수록 outer table의 전체 조회 횟수가 증가 하기 때문입니다.
- index가 있을 경우 random access 횟수가 증가 하기 때문에 이슈 발생 (index -> driving table random access) * (driving table refrence key -> index -> outer table random access)
- 이유
- 다량의 IO가발생 -> random access를하게 되면 block이 memory에 load 되기 때문에 많은 성능이슈가 발생할 수 있습니다.
- index를 사용해 최대한 좁은 범위의 데이터를 조회할 때 유리합니다.(reference key를 처럼 상요할때 무조건 index를 생성해야지 성능 이득을 취할 수 있습니다.)
Merge Sort 방식
- 저가 자주 사용하는 mysql은 지원 하지 않습니다.
- 두 table의 조인 범위 가 넓으며, sort가 필요한 경우 사용합니다.
- 두 table간에 index가 없을 경우 주로 사용되기도 합니다.
- 정렬을 위한 memory area size에 따라서 성능이 많이 차이가 나게 됩니다.
- 두 table를 전체 조회 하기때문에 서버 부하 이슈가 크게 생길 수 있습니다.
- join연산자가
=
이 아닐 경우 유리합니다
Hash Join 방식
- MySQL은 8.0.18 버전부터 지원합니다
- 2 table중 작은 table을 hash table을 memory 여역에 생성 join하는 방식입니다
- 충돌이 최소화 하는 hash 함수를 사용하게되면 성능에 유리 합니다.
- 충돌이 발생하면 LinkeHashMap형태로 LinkedList형태로 저장합니다.
- HashTable이 생성된 후에는 nestedLoop 방식처럼 outer table 을 선형적으로 loop를 돌면서 hash table 에 접근해 join 하는 방식을 취합니다
반응형
'CS > Database' 카테고리의 다른 글
RDB Semi Join을 이용한 성능 최적화 (0) | 2021.12.12 |
---|---|
RDB Index (0) | 2021.12.09 |
NamingLock을 이용한 동시성 이슈, Deadlock query 이슈 해결 (0) | 2021.12.01 |
DB Isolation (0) | 2021.10.30 |
Mysql Replication (3) | 2021.10.06 |