inflearn logo
강의

講義

知識共有

6週間で完成!バックエンド職務経歴書の差別化戦略4選 - 似たり寄ったりの書類の中で目を引く方法

3-9. 実際の例題コードで作成する - 1

실행계획에서 드라이빙 테이블과 드리븐 테이블을 판단하는 기준

解決済みの質問

205

cho766

投稿した質問数 26

1

1. 현재 학습 진도

2. 어려움을 겪는 부분

교안 내용

MySQL에서 두 테이블을 조인할 때 가장 기본적인 메커니즘은 Nested Loop Join입니다.

위 EXPLAIN 결과에서 m 테이블이 첫 번째로 표시되고, o 테이블이 두 번째로 표시되는 것은, m이 외부(outer) 루프 테이블, o가 내부(inner) 루프 테이블이 된다는 의미입니다.

 

실행계획 결과

image.pngimage.png

mysql db

回答 3

0

optional94

제보드립니다! notion 은 최신 수정 반영된 상태인데, pdf 파일은 최신 반영이 안된 상태입니다!

0

dingcodingco

optional 님 제보 감사드립니다! pdf 도 새로 업데이트 했습니다 감사합니다!!

0

dingcodingco

안녕하세요 cho766님!! 좋은 질문 너무너무 감사합니다!!

우선, 실행계획에서 드라이빙 테이블과 드리븐 테이블 구분 기준을 구하는 방법을 말씀드려보겠습니다!

강의에서 말하는 "실행계획 결과에서 멤버 테이블이 먼저 나왔기 때문에 드라이빙 테이블"이라는 설명은 EXPLAIN명령으로 출력된 값을 기준으로 한 것입니다! EXPLAIN 결과에서 table 컬럼에 나열된 순서가, MySQL의 Nested Loop Join에서 outer loop (드라이빙 테이블) → inner loop (드리븐 테이블) 순서를 보여줍니다. 따라서 EXPLAIN 결과에서 m 테이블이 먼저 나오고, o 테이블이 두 번째로 나왔다면, m이 드라이빙 테이블입니다!

 

질문에 언급하신 다이어그램은 조인의 흐름을 시각적으로 표현한 것이지만, 테이블 순서(outer/inner)는 명시적으로 보이지 않습니다. 따라서 EXPLAIN으로 출력한 텍스트 결과표 기준으로 실제로 드라이빙/드리븐 테이블의 순서를 파악해야 합니다!

 

그럼 여기서 더 나아가서 추가적으로 왜 멤버 테이블을 먼저 읽을까? 라는 궁금증이 생길 수 있습니다! MySQL 옵티마이저 조인 순서를 결정할 때 다음과 같은 요소들을 고려합니다.

  1. 테이블 크기 (row 수) : 일반적으로 더 작은 테이블을 드라이빙 테이블로 선택하는 경향이 있습니다. 멤버 테이블은 보통 회원 수(예: 몇 천 ~ 몇 만)로 제한적이지만, 주문 테이블은 회원당 여러 건이 쌓이기 때문에 훨씬 클 가능성이 높습니다. 따라서

    작은 테이블인 멤버(m) 테이블을 먼저 읽고, 그에 해당하는 주문만 찾는 것이 더 효율적입니다.

  2. 조건절 및 인덱스 사용 가능성 :

    옵티마이저는 WHERE, ON 조건절에서 사용 가능한 인덱스 유무도 고려합니다. 예를 들어, 멤버 ID로 조인을 걸고 이 ID에 인덱스가 있다면, 멤버 테이블에서 한 행을 가져와서 주문 테이블에서 인덱스를 통해 빠르게 조회할 수 있습니다!

    즉, 멤버 테이블 한 건 → 주문 테이블에서 매칭되는 건만 찾아가는 Nested Loop 방식에 최적화되어 있다고 할 수 있습니다

좋은 질문 주셔서 감사합니다 초님!! 해당 내용은 교재에도 추가로 서술해두도록 하겠습니다 기여해주셔서 감사드립니다!!

0

cho766

딩코딩코님 정성스런 답변 감사합니다!! ㅎㅎ 덕분에 조인 관련 개념을 이해하는데 도움이 되었습니다.

한 가지 반영을 부탁드리고 싶은 점이 현재 교안에는

image.png

다음과 같이 EXPLAIN 결과에서 o 테이블이 먼저 표시가 되어서

위 EXPLAIN 결과에서 m 테이블이 첫 번째로 표시되고, o 테이블이 두 번째로 표시되는 것은, m이 외부(outer) 루프 테이블, o가 내부(inner) 루프 테이블이 된다는 의미입니다.

라는 교안의 설명을 이해하는데 혼동이 있을 것 같습니다. 직접 실습한 결과에서는 m 테이블이 먼저 표시가 돼서 드라이빙 테이블과 드리븐 테이블을 구분하는 것이 이해가 됐습니다.

 

1

dingcodingco

헛 그렇네요!!! 제보 감사드립니다!!

image.png

다행히 수업 영상에서는 m 이 먼저 노출되어서, 요 내용을 기반으로 교재만 변경해뒀습니다 !!! 제보 넘넘 감사드립니다 ㅎㅎㅎ 좋은 하루 보내세요!!

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

cho766님이 말씀해주신 실행 계획을 이해하기 위해서는 MySQL의 조인 메커니즘과 EXPLAIN 명령어의 출력 결과를 이해하는 것이 중요합니다.

MySQL에서 기본적인 조인 방법인 Nested Loop Join에서는 드라이빙 테이블(outer table)을 먼저 선택합니다. 이 테이블의 각 행에 대해, 드리븐 테이블(inner table)에서 관련 행을 검색하는 방식으로 연산이 이뤄집니다.

EXPLAIN 명령어를 사용한 결과의 테이블 순서는 기본적으로 드라이빙 테이블이 먼저 나오고, 다음에 드리븐 테이블이 나옵니다. 따라서 cho766님이 가지고 계신 EXPLAIN 결과에서 m 테이블이 먼저 나왔기 때문에 m 테이블이 드라이빙 테이블이고, o 테이블이 드리븐 테이블입니다.

질문에서 언급하신 이미지를 보면, 첫 번째 이미지는 EXPLAIN 명령어의 결과표를 보여주며, 두 번째 이미지는 시각화된 쿼리 실행 계획을 보여줍니다. 이러한 시각화에서는 각 연산의 비용과 행 수가 표현되어 있습니다. 특히, Nested Loop와 관련된 정보가 나타나는 것을 통해 실행 순서를 파악할 수 있습니다.

더 궁금한 점이 있으시다면, 이미지에 대한 자세한 설명과 함께 다시 문의 주시길 바랍니다.

이미지 URL 및 설명:
- 첫 번째 EXPLAIN 결과: 링크
- 두 번째 쿼리 실행 계획: 링크

조회속도 개선에서 더 개선하는 방법이 궁금합니다.

0

8

1

Build 관련 문제 (테스트 관련 문제)

0

38

2

인덱스 관련 질문 있습니다.

0

64

2

비관적 락 구현 방식 문의 건

0

67

2

외부 api 처리 방안에 대하여 궁금한 점이 있습니다.

0

87

2

네임드 락 사용 시 커넥션 풀을 분리하는 방법에 대한 질문

0

78

2

이벤트) 백엔드 기술면접 실전문제집

0

99

2

로컬에서 테스트 한 결과를 이력서에 써도 괜찮을까요?

0

128

2

데드락 발생 시, 외래 키를 제거하는 방법 관련 질문

0

83

2

Redis 캐싱을 도입하는데 db조회와 성능이 차이가 거의 없습니다.

0

108

2

k6 부하테스트 중인데 개선 전 성능이 너무 안나와서 고민

0

118

2

강의와 성능수치 비교

0

101

2

13강 강의 뒷부분의 과제 안내부분은 어디있나요?

0

50

2

이벤트 참가자 수 증가 후, save 메서드 호출 코드 질문

0

64

2

[수업 자료 질문] Cache Aside의 특징 문의

0

82

2

[수업자료 문의] RedisTemplate으로 SETNX 시 리턴값 문의

0

79

2

멀티스레드 상황인데 currentParticipants 가 AtomicInteger가 아닌 이유?

0

86

3

클라우드 환경 배포시 부하 테스트 방식에 대하여

0

136

2

k6 dashboad 안나오는 상

0

111

2

2-4 도커 빌드 에러가 계속 납니다.

0

296

2

AWS EC2에 도커 컨테이너가 동작하지 않을 때 확인 해야하는 것

0

113

2

성능 측정시

0

107

2

API 별 실행 쿼리 모니터링 구현 질문 있습니다.

0

81

2

트랜잭션 격리성 설계도 어필포인트로 가져갈 수 있을까요?

1

65

2