하루 종일 고민하다 여기에 적어 봅니다..ㅡㄴㅡ
MYSQL을 이용하여 데이터를 뽑고 있습니다
테이블이 3개가 있습니다.
각각 A, B, C 라고 하고
구조는 다음과 같이 똑같습니다
id varchar(8)
day varchar(8)
A는 20만건
B는 180만건
C는 150만건의 로우가 있구요.
원하는 결과는 A , B , C 테이블에서 일정기간 이전에 존재하는 모든 ID를 유니크하게 뽑아내는 겁니다.
제가 쓰는 쿼리는 이렇습니다
select count(distinct x.id) event from
((select id from A where day<=20080531)
union all
(select id from B where day<=20080531)
union all
(select id from C where day<=20080531)
) x
실행계획(explain 결과는 )
1 | PRIMARY| <derived2>| ALL | NULL | NULL | NULL | NULL | 498804 ||
2 | DERIVED| A| ref | IDX_DAY | IDX_DAY | 5 | | 37871 | Using where |
3 | UNION | B| ref | IDX_DAY | IDX_DAY | 5 | | 114103 | Using where |
4 | UNION | C| ref | IDX_DAY | IDX_DAY | 5 | | 170692 | Using where |
NULL | UNION RESULT | <union2,3,4>| ALL | NULL | NULL | NULL | NULL | NULL ||
으로 약 5.6초가 걸리네요.
union all 이후에 full scan을 해서 시간이 오래 걸린다는 건 알겠는데....
이거 극복해 내는 방법 없을까요?
|