database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29494 게시물 읽기
No. 29494
쿼리에 응답이 너무너무너무 느려요 ㅠㅠ
작성자
염진근(디비저)
작성일
2010-01-04 13:38ⓒ
2010-01-04 19:13ⓜ
조회수
7,045

세개의 테이블을 조인해서 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

 

이 글에 대한 댓글이 총 1건 있습니다.

일단 PS1에 대해서만 말씀드리자면, MySQL은 CREATE/DROP Index를 할 때에 copying to temporary table작업을 수행합니다. 단 하나의 인덱스를 추가/삭제 할 경우에도 같은 작업이 발생이 되며, 경우에 따라 아예 새로 설계된 테이블에  INSERT INTO [new] SELECT * FROM [old] 로 작업하는 것이 더 빠를 때가 있습니다.

 

 

박현우(lqez)님이 2010-01-06 10:35에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29497한글 사용하려면 소스로 설치해야 하나요? [3]
네오
2010-01-06
7047
29496그룹으로 묶는 쿼리문. [1]
강민정
2010-01-06
6523
29495MySQL 느려지는 현상 [1]
H맨
2010-01-06
8277
29494쿼리에 응답이 너무너무너무 느려요 ㅠㅠ [1]
염진근
2010-01-04
7045
29493like ? 이 무슨 뜻인가요??? [2]
테스트
2010-01-04
6661
29492[트리거]mysql -> 오라클 가능한가요? [1]
푸르미
2009-12-28
6932
294915.1.34에서 partition 기능을 추가하려면 DB재설치를 해야 할까요? [1]
김승동
2009-12-28
6482
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다