MySQL 조인 EXPLAIN 관련 질문입니다. 0 6 782

by 찡스쿄 [MySQL] mysql explain type 풀스캔 [2020.11.17 15:33:21]


캡처.PNG (18,338Bytes)

안녕하세요, 선배님들.

쿼리 작성 도중 궁금한 점이 생겨, 조심스레 질문을 올려봅니다..

아래의 쿼리를 실행하면 두 번째 테이블(tsm)과 , 세 번째 테이블(tcm)은 type이 ref인데

tam은 type이 ALL로 풀스캔을 의미하고 있습니다..

첫 번째 테이블(tsm) 테이블은 ASSIGN_SQ, CHARGE_SQ를 둘 다 FK로 참조하고 있고요..

어떠한 이유에서 tam만 풀스캔을 의미하는지 궁금합니다.

선배님들의 답변 미리 감사드립니다. (꾸벅)
(explain 결과는 첨부파일에 포함되어 있습니다!)


explain
SELECT
	  tam.ASSIGN_NM
	, tcm.CHARGE_NM
	, COUNT(*) AS visitCnt
	, COUNT(CASE tsm.CONTRACT_YN WHEN 'Y' THEN 1 END) AS contractCnt
FROM TB_SALES_MG tsm 
INNER JOIN TB_ASSIGN_MG tam ON
	tam.ASSIGN_SQ = tsm.ASSIGN_SQ
INNER JOIN TB_CHARGE_MG tcm ON
	tcm.CHARGE_SQ = tsm.CHARGE_SQ 
GROUP BY
	tsm.CHARGE_SQ
ORDER BY
	  tsm.SALES_DT DESC
	, tsm.SALES_SQ DESC

 

by 마농 [2020.11.17 16:07:37]

쿼리를 보면 조인 조건만 있고 검색 조건은 없습니다.
인덱스는 조건 검색과 조인 검색 두가지 형태로 사용됩니다.
이 경우에는 조인 할 때만 인덱스가 사용되는 거죠.
조건 검색이 없으니 풀스캔 입니다.
테이블 읽는 순서가 가장 빠른 테이블을 풀스캔 하겠네요.
다른 테이블을 먼저 읽었다면 그 테이블이 풀스캔 되겠네요.
-- 실행계획 해석 --
1. tam 이 먼저 테이블 풀스캔 하고
2. tam.ASSIGN_SQ 를 조건으로 tsm 의 RefTB_ASSIGN_MG5 인덱스 스캔을 하네요.
3. tsm.CHARGE_SQ 를 조건으로 tcm 의 PRIMARY 인덱스 스캔을 하네요.


by 찡스쿄 [2020.11.17 17:20:55]

답변 감사드립니다! 마농 선생님...

선생님께서 말씀하신대로라면 풀스캔을 하는 것이 맞고,

단지 WHERE 조건이 없기 때문이라는 말씀이신 건가요?!..

전체 데이터 SELECT에서 풀스캔을 하지 않을 수 있는 방법이 있는지 궁금합니다!..


by 마농 [2020.11.17 17:37:03]

무조건 인덱스 스캔 타야 하는게 아닙니다.
대량의 자료 중 소량의 자료를 검색할 때 인덱스 스캔이 유리합니다.
대량의 자료 검색시에는 풀스캔이 유리합니다.
억지로 인덱스 태우려면 힌트를 이용해야 하는데. 억지로 한다고 되는게 아닙니다.


by 찡스쿄 [2020.11.17 17:41:46]

아... 선생님 덕분에 오늘도 크게 하나 배워가네요...

답변 주셔서 정말 감사드립니다. ^^

항상 좋은 일들만 가득하시길 바랍니다!

정말 감사드립니다!


by 마농 [2020.11.17 16:15:56]

쿼리를 보면 그룹바이 집계쿼리의 잘못 사용된 예제 입니다.
그룹바이 절에 명시되지 않은 항목이 집계함수 없이 단독으로 쓰이면 에러입니다.
MySQL 에서만 허용되는 표준에 어긋나는 구문입니다.


by 찡스쿄 [2020.11.17 17:17:30]

앗.. 잠시 잊고 있었습니다... 답변 정말 감사드립니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입