개발 Q&A

제목 mysql 풀아우터 조인 후에 서브쿼리
카테고리 DB
글쓴이 주말생각 작성시각 2021/04/14 14:33:37
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 7526   RSS

개발환경

mysql 5.0

 

두 개의 테이블을 풀아우터 조인을 하기 위해서 아래와 같이 쿼리를 만들었습니다.

SELECT ex01, ex02, A_exDate AS ddate 

FROM A 

UNION 

SELECT ex01, ex02, B_exDate AS ddate 

FROM B

그리고 위의 쿼리를 서브쿼리로 만들었습니다.

select *from
(SELECT ex01, ex02, A_exDate AS d_date 
FROM A
where A_exDate >= 'xxxx-xx-xx' AND A_exDate <= 'xxxx-xx-xx' 
UNION
SELECT ex01, ex02, B_exDate AS d_date 
FROM B
where B_exDate >= 'xxxx-xx-xx' AND B_exDate <= 'xxxx-xx-xx'
) AS c
GROUP BY c.d_date

그룹바이는 필요에 의해서 했습니다.

쿼리문을 실행시키니 확실히 느리더라고요. 

EXPLAIN select *from
(SELECT ex01, ex02, A_exDate AS d_date 
FROM A
where A_exDate >= 'xxxx-xx-xx' AND A_exDate <= 'xxxx-xx-xx' 
UNION
SELECT ex01, ex02, B_exDate AS d_date 
FROM B
where B_exDate >= 'xxxx-xx-xx' AND B_exDate <= 'xxxx-xx-xx'
) AS c
GROUP BY c.d_date

으로 어떻게 성능을 개선할 수 있는 부분을 찾을 수 있을까해서 보니 테이블 A는 type이 rang이고 테이블B는 type이 ALL이더라고요.

테이블A만 조건에 해당하는 데이터 부분만 검색하고 테이블B는 전체 스캔을 하더라고요. 분명 똑같이 조건을 줬는데, 테이블 B만 전체 스캔을 하는 이유를 모르겠습니다.

 다음글 웹서버 분리에 대해서 (2)
 이전글 그룹바이 정렬 (5)

댓글

한대승(불의회상) / 2021/04/14 14:34:53 / 추천 0
B_exDate 에 인덱스 걸려있나 확인해 보세요.
주말생각 / 2021/04/14 14:39:58 / 추천 0

select하는 컬럼에는 모두 인덱스를 걸었습니다.

+지금 확인해보니 

EXPLAIN SELECT ex01, ex02, B_exDate AS d_date
FROM B
where B_exDate >= 'xxxx-xx-xx' AND B_exDate <= 'xxxx-xx-xx'

만 실행하니 이래도 전체 스캔이네요. 이게 문제인듯 싶은데...

주말생각 / 2021/04/14 15:48:31 / 추천 0

+이유를 알 것 같습니다.

스캔 방식이 데이터의 양에 따라서 DBMS가 임의로 판단하여 가장 적합한 방법을 사용하는 것 같습니다. 테이블B의 경우에는 데이터가 A에 비해서 상당히 많거든요. 대략 데이터 비율이 1:200 정도입니다.

아마 테이블 B의 데이터가 많아서 풀스캔을 하는 것이 아닌가 싶습니다.

혹시 제가 잘 못 이해해고 있지는 않겠지요.

변종원(웅파) / 2021/04/14 15:52:13 / 추천 0

index 걸린 date 필드를 대상으로 테스트를 해봤는데 < > 조건 일 경우 인덱스를 안타고 = 조건일 경우는 인덱스를 타는 현상이 나오네요.

아래와 같이 테이블명 뒤에 FORCE_INDEX 를 선언하니 인덱스를 탑니다. 테스트 해보세요

explain select *, supportEndDate as st from license FORCE INDEX(supportEndDate) where `supportEndDate` >= '2020-01-01' and supportEndDate <= '2021-12-01'        ;

주말생각 / 2021/04/14 16:03:01 / 추천 0

변종원님

감사합니다. 그런데 인덱스를 타게하니까 속도가 더 걸리네요. 풀스캔이 더 적합한 건지...이대로 인덱스를 타게할지 고민되네요. 대략 0.07초 차이가 있는데

한대승(불의회상) / 2021/04/14 16:46:33 / 추천 0
당연하게도 컬럼 타입은 datetime 이거나 date 이겠죠. ^^;;