Inflearn brand logo image

인프런 커뮤니티 질문&답변

cho766님의 프로필 이미지
cho766

작성한 질문수

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

3-9. 실제 예시 코드로 작성하기 - 1

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

해결된 질문

작성

·

72

·

수정됨

1

1. 현재 학습 진도

  • 몇 챕터/몇 강을 수강 중이신가요?

    • 3-9

       

  • 여기까지 이해하신 내용은 무엇인가요?

    • MySQL에서 조인 연산을 수행할 때, 드라이빙 테이블과 드리븐 테이블로 구분되어 테이블의 각 행마다 연산이 진행되는 것으로 이해했습니다.

2. 어려움을 겪는 부분

  • 어느 부분에서 막히셨나요?

    • 회원별 주문통계 쿼리 수행 시, 참조되는 주문 테이블과 멤버 테이블 중 멤버 테이블이 드라이빙 테이블이며, 실행계획 결과에서 멤버 테이블이 먼저 나왔기 때문이라고 하셨는데, 언급하신 실행결과가 다이어그램인가요? 아니면 DESC 로 출력한 결과표인가요?

    • 만약, DESC로 출력한 결과표를 말씀하신거면 그림 상에서는 주문 테이블이 먼저 나와있고, 다이어그램으로 봤을 때는 테이블의 표시 순서가 보이지는 않는데, 어떠한 근거로 멤버 테이블이 드라이빙 테이블이라고 한건지 궁금합니다.

교안 내용

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

  • 드라이빙 테이블(outer table)에서 한 행씩 가져오고,

  • 각 행마다 드리븐 테이블(inner table)을 인덱스 등을 이용해 조회하는 방식

    으로 이루어집니다.

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

 

실행계획 결과

image.pngimage.png
  • 두 사진 모두 강의 교안에 있는 사진입니다.

     

답변 2

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 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 방식에 최적화되어 있다고 할 수 있습니다

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

cho766님의 프로필 이미지
cho766
질문자

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

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

image.png

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

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

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

 

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

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

image.png

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

0

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

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

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

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

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

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

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

cho766님의 프로필 이미지
cho766

작성한 질문수

질문하기