세개의 테이블을 조인해서 select 문을 쓰는데요...
A(메인) 테이블 로우 수 : 4,739,461
B 테이블 로우 수 : 210,035
C 테이블 로우 수: 48,887
B,C 는 각 ID별로 인덱스가 잡혀 있고, A는 (col1),(col2),(col3) 이렇게 Where 절에 들어가는 세개의 컬럼을 복합 인덱스로 잡아놓고
A의 ID를 뽑아서 그와 일치하는 B, C의 값들을 구하는 쿼리 입니다.
where 절에 들어가는 데이타량에 따라 속도가 달라지는데요, 최소 5초에서 30초까지 걸리네요...
이런 상황일때 해줄수 있는 파라미터 튜닝이라던가, 인덱스 생성이나 삭제, 또는 쿼리에 관해 조언 좀 부탁드립니다.
참고로 스키마 자체를 수정하기는 힘든 상황입니다... 설계 자체가 잘못된건 알지만;;; 현 상태에서 최적의 속도를 낼수 있는 방법을 알고 싶습니다.
PS 1 - A 테이블에 인덱스를 생성, 삭제 하는데 거의 하루가 꼬박 걸리네요...원래 그런건가요;; (PC는 램 1기가 CPU 1.69GHz 팬티엄 노트북입니다.)
PS 2 - A 테이블의 Where 절에 서브 쿼리를 사용하면 아예 멈춰 버리다 시피 하는데요... 그래서 미리 서브 쿼리를 날린 후에 거기에 대응하는 로우값들을 일일이 IN () 절에 써 주는 식으로 해야 먹더군요;; 저 IN () 안에 서브쿼리를 쓰면 멈추는 이유는 뭔가요?
기본 쿼리는
SELECT
SUM(IF(B.ID_Col ='2',1,0)),
ROUND(SUM(IF(A.Col5 = 'X' AND C.col1 = 'X' AND C.col2 ='X' , 1,0))/SUM(IF(C.col1 = 'X' , 1,0)),2)
FROM A , B , C
WHERE A.ID_Col= B.ID_col AND A.ID_Col = C.ID_Col
AND A.col1 IN ('X','Y','Z') AND A.col2 IN ('X','Y','Z') AND A.col3 >= '20091030060000' AND A.col3 <= '20091105060000';
테이블 스키마는 다음과 같습니다.
A 테이블 - CREATE TABLE `A` (
`seq` bigint(20) unsigned NOT NULL DEFAULT '0',
`col...`` int(11) NOT NULL,
`col...` char(2) DEFAULT NULL,
`col...` varchar(12) DEFAULT NULL,
`col...` varchar(2) DEFAULT NULL,
`col...` varchar(18) DEFAULT NULL,
`col...` varchar(8) DEFAULT NULL,
`col...` varchar(10) DEFAULT NULL,
`col...` varchar(5) DEFAULT NULL,
`col...` varchar(7) DEFAULT NULL,
`col...` varchar(22) DEFAULT NULL,
`col...` varchar(3) DEFAULT NULL,
`col...` varchar(16) DEFAULT NULL,
`col...` varchar(16) DEFAULT NULL,
`col...` varchar(12) NOT NULL,
`col...` varchar(12) DEFAULT NULL,
`col...`varchar(12) DEFAULT NULL,
`col...`` varchar(10) DEFAULT NULL,
`col...` varchar(16) DEFAULT NULL,
`col...`` varchar(4) DEFAULT NULL,
`col...`` varchar(4) DEFAULT NULL,
`col..` varchar(3) DEFAULT NULL,
`col..` ` varchar(4) DEFAULT NULL,
`col..` varchar(4) DEFAULT NULL,
`col..` varchar(4) DEFAULT NULL,
`col..` varchar(3) DEFAULT NULL,
`col..` varchar(3) DEFAULT NULL,
`col..` varchar(3) DEFAULT NULL,
`col..` ` varchar(3) DEFAULT NULL,
`col..` ` varchar(3) DEFAULT NULL,
`col..` ` varchar(3) DEFAULT NULL,
`col..` ` varchar(3) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
col..` ` varchar(5) DEFAULT NULL,
`col..` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(5) DEFAULT NULL,
`col..` ` varchar(14) DEFAULT NULL,
`col..` ` varchar(14) DEFAULT NULL,
`col1` ` varchar(14) DEFAULT NULL,
`col2` varchar(14) NOT NULL,
`col3` ` varchar(2) DEFAULT NULL,
`ID_Col` varchar(10) DEFAULT NULL,
PRIMARY KEY (`seq`),
KEY `idx_ID_Col` (`ID_Col`),
KEY `idx_col1_col2_col3` (`col1_col2_col3`),
) ENGINE=InnoDB DEFAULT CHARSET=euckr
B 테이블 -
CREATE TABLE `B` (
`col...` bigint(20) DEFAULT NULL,
`col...` varchar(14) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) NOT NULL,
`col...` varchar(20) DEFAULT NULL,
`ID_Col` varchar(20) NOT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(4) DEFAULT NULL,
`col...` int(4) DEFAULT NULL,
PRIMARY KEY `ID_Col`` (`ID_Col`
) ENGINE=InnoDB DEFAULT CHARSET=euckr
C 테이블 -
CREATE TABLE `C` (
`seq` bigint(20) NOT NULL AUTO_INCREMENT,
`col...` varchar(20) DEFAULT NULL,
`ID_Col` varchar(20) NOT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...`varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...`varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...` varchar(20) DEFAULT NULL,
`col...`` varchar(20) DEFAULT NULL,
`col...`` varchar(20) DEFAULT NULL,
`col...` varchar(10) DEFAULT NULL,
`col...` varchar(14) NOT NULL,
`col...` varchar(30) DEFAULT NULL,
`col...` varchar(30) DEFAULT NULL,
`col...` varchar(30) DEFAULT NULL,
PRIMARY KEY (``ID_Col`)
UNIQUE KEY `seq` (`seq`)
) ENGINE=InnoDB AUTO_INCREMENT=48888 DEFAULT CHARSET=euckr
|