작성
·
49
0
10강 LEFT JOIN 주의사항 및 튜닝에서
explain select u.id, u.name, uc.coupon_id, uc.use_yn
from user u
left join user_coupon uc on uc.user_id = u.i and uc.coupon_id = 3;
위 쿼리의 실행계획으로
type ALL 이 나왔는데요
왜 u.id는 primary key인데 왜 index가 나오지 않고 ALL이 나오는 걸까요?
left join 시 where 절에 조건이 없으면 드라이빙 테이블은 항상 ALL로 읽나요?
혹시 u.name을 select절에 포함해서 ALL이 나오는걸까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
또또록님께서 제기하신 궁금증은 MySQL의 쿼리 실행 계획과 인덱스 사용과 관련하여 매우 중요한 부분입니다. MySQL에서 LEFT JOIN
을 사용할 때 드라이빙 테이블의 선택과 ALL
타입이 나타나는 이유를 설명드리겠습니다.
LEFT JOIN의 드라이빙 테이블:
LEFT JOIN
은 왼쪽에 명시된 테이블을 기준으로 잡습니다. 따라서 user u
테이블이 드라이빙 테이블이 됩니다.LEFT JOIN
특성상 모든 row를 확인해야 하므로 ALL
이라는 접근 타입이 나타날 수 있습니다.ALL
이 나오는 것은 아닙니다. 만약 WHERE
절 등에서 특정한 조건을 통해 인덱스를 효과적으로 사용할 수 있다면, 옵티마이저는 이를 고려할 수 있습니다.드라이빙 테이블의 ALL
읽기:
ALL
이 사용하는 이유 중 하나는 인덱스 구성이거나 쿼리 문 맥락에 따라 결정될 수 있습니다.u.name
이 SELECT 절에 포함되어 있다고 하더라도, 기본적으로는 인덱스가 설정되어 있지 않은 컬럼에 대해 테이블 전체 스캔을 해야 하는 상황에서는 ALL
이 나올 수 있습니다.Optimal 인덱스 활용 방안:
EXPLAIN
명령어를 사용하여 실행 계획을 확인하고, 인덱스가 어떻게 사용되는지 분석하는 것이 중요합니다.user
테이블에 대한 적절한 인덱스를 검토하고 WHERE
절에 대한 추가적인 조건을 고려해볼 수 있습니다.질문하신 내용과 관련하여 더 자세한 설명이 필요하시다면, 다음과 같은 유사 답변도 참고하시길 권장드립니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.