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 29510 게시물 읽기
No. 29510
쿼리문과 서버튜닝 질문입니다.
작성자
고재철
작성일
2010-01-16 16:29
조회수
7,057

안녕하세요.

요즘 디비가 불안정해서 엄청나게 고민하고 있는 사람입니다 ㅠㅠ..

우선 쿼리 질문부터 하겠습니다.

CREATE TABLE `user` (
  `id` VARCHAR(16) NOT NULL,
  `group_idx` INT(11) DEFAULT NULL,
  PRIMARY KEY  (`id`)
)

CREATE TABLE `group1` (
  `group1_id` VARCHAR(16) NOT NULL DEFAULT '',
  PRIMARY KEY  (`group1_id`)
)

CREATE TABLE `group2` (
  `idx` INT(11) NOT NULL AUTO_INCREMENT,
  `group1_id` VARCHAR(16) NOT NULL,
  `group2_id` VARCHAR(16) NOT NULL,
  PRIMARY KEY  (`group1_id`,`group2_id`),
  UNIQUE KEY `idx` (`idx`),
  CONSTRAINT `FK_group2` FOREIGN KEY (`group1_id`) REFERENCES `group1` (`group1_id`) ON DELETE CASCADE ON UPDATE CASCADE
)

CREATE TABLE `data` (
  `user_id` VARCHAR(16) DEFAULT NULL,
  `data1` VARCHAR(50) DEFAULT NULL,
  `data2` VARCHAR(50) DEFAULT NULL,
  `date` DATE DEFAULT NULL,
  KEY `data_date` (`date`)
)

위와 같은 테이블이 있고

user 테이블에는 약 3만건의 데이타

group1에는 약 100건

group2에는 약 5천건

data에는 약 1500만건의 데이터가 있습니다.

하루에 data 테이블에 약 10만건의 데이터가 들어옵니다.

 

한 그룹(group2)에 대해 일정기간동안의 데이터를 조회하는 쿼리문을 다음과 같이작성하였습니다.

 

select *

from

(select id from user where group2_idx = 그룹) t1

left join

data t2

on t1.id = t2.user_id

where t2.date like '2009-10%'

 

그런데 검색속도가 많이 느리더군요... 그래서 개선 방법이 없는지 궁금합니다.

추가적으로 인덱스에 관해서 몇가지 궁금한 것이 있는데..

인덱스가 사용되는 조건? 이 궁금합니다. where절이나 join절에서 인덱스가 사용되고, 인덱스를 잡은 순서대로만 조건문을

사용해야 인덱스가 사용되고, 하나의 인덱스만 사용된다고 알고 있는데.. 정확한지 궁금합니다..

 

두번째로 서버 튜닝에 관해서 몇가지 질문좀 드리겠습니다.

우선 서버 스펙은 xeon 1.8Ghz  , 4G,  SCSI 76GB입니다.  윈도2003서버에 mysql 5.0쓰고있습니다.

Mysql Adminstrator를 사용해서 모니터링과 설정을 변경하고 있는데요...

서버 가동을 하면.. can't shared library "mysqlDll.dll" (errno : 0) 인가? 와 같은 메시지가 나옵니다.

서버가 정상가동은 됩니다. 오히려 위와 같은 메시지가 없이 서버가 구동이 되면... 접속이 되지를 않습니다. -_-;;

그리고 InnoDB를 사용하는데 innodb_buffer_pool_size를 512MB이상인가? 설정을 해놓고 서버 가동을 하면

접속이 되지를 않습니다(위와 같은 mysqlDll.dll 에러가 나오지 않고 시작됐다고 메시지가 나오지만 접속이 되지 않습니다)

그외에도 innodb_log_buffer_size? 인가.. 로그 관련한 메모리 사이즈를 변경하고 시작해도 정상적으로 접속이 되지 않더군요.. ㅠㅠ...

 

추가적으로 한가지 궁금한 것이있는데...  서버에서 커넥션 쓰레드가 70개 이상생성되면 os dependent bug가 발생합니다.. 더이상 쓰레드를 생성할수 없다고 하더군요 -ㅅ-...

이부분에 대해 아시는 분이 계시면 조언좀 부탁드립니다.

AppServer단에서 풀링을 사용하여 처리하고 있어서 문제가없지만... 사용자가 점점늘어나서...조만간 동시에 사용되어야 하는 커넥션 수가 증가 될것같습니다. ㅠㅠ.

혹시 추가적으로 필요한정보가 있으시다면.. 댓글로 남겨주시면... 보고 추가하겠습니다.

답변부탁드립니다.

 

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

쿼리에 대해서만 말씀드리자면, 기본적으로  EXPLAIN해보시면 쿼리가 느린 이유를 아실 수 있습니다.

 

(1) select id from user where group_idx = 그룹

위의 쿼리에서 group_idx에 대한 인덱스가 없으므로, 쿼리 캐쉬를 잘 타지 않는 이상, 매번 3만건의 데이터를 풀스캔하게 됩니다.

 

(2) on t1.id = t2.user_id

t2(data)에도 user_id에 대한 인덱스가 없으므로 조인시 1500만건에 대한 부담이 있겠네요.

 

(3) where t2.date like '2009-10%'

`date`컬럼은 date형식이기 때문에 다음과 같이 쿼리를 수정하시는 것이 좋겠습니다. between쓰셔도 됩니다.

WHERE t2.`date` >= '2009-10-01' AND t2.`date` < '2009-11-01'

(혹시 like사용하면 제가 제시한 것과 같이 최적화 되나요? 저는 잘 몰라서 위와 같이 하고 있습니다.제가 틀렸다면 지적해주세요.)

 

(4) t1을 서브쿼리 하는 것 보다, 3개 테이블을 조인하는 것이 낫지 않을까 생각해봅니다.

 

 

 

박현우(lqez)님이 2010-01-19 07:50에 작성한 댓글입니다.
이 댓글은 2010-01-19 07:51에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
29515MySQL에서 C API 사용 ^^ [1]
맥초보
2010-01-21
6421
29513like 와 INSTR 어떻게 속도 면에서 좋아요? [1]
홍길동
2010-01-21
9629
29511서브쿼리 속도 [1]
궁금이
2010-01-19
7046
29510쿼리문과 서버튜닝 질문입니다. [1]
고재철
2010-01-16
7057
29509MYSQL이 중단된 경우... [2]
송기창
2010-01-15
6006
29508치환 쿼리문 꼭좀 알려주시면 감사드리겠습니다. [3]
누에고치
2010-01-15
6320
29507일반로그 갱신 질문입니다. [2]
방방방
2010-01-14
6712
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다