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 27182 게시물 읽기
No. 27182
최상의 처리속도를 얻기 위해 index key 를 어떻게 주어야 하겠는지요
작성자
강요찬(kyc3003)
작성일
2007-11-20 12:34ⓒ
2007-11-20 14:08ⓜ
조회수
3,634

안녕하세요.
디비 인덱스를 어떻게 잡아야할 지 고수님들의 조언을 구합니다.

처음 보여지는 메인화면에 저쪽 아래와 같은 sql들이 모여 있습니다.
최상의 처리속도를 얻기 위해 index key 를 어떻게 주어야 하겠는지요?
그저 조건절에 연결된 필드 중 일부를 인덱스키로 주는 것 이외에 다른 방법은 없는지요?

그리고 

aci_code like '01%' or aci_code like '03%'
위와 같이 like 로 연결된 부분을 하나의 독립필드로 만들어 놓은 뒤

aci_code_2='01' or aci_code_2='03'
이렇게 소스를 수정할 경우 처리속도는 어느정도 빨라질 수 있겠는지요?


$end=date("Y-m-d H:i:s");
$enddays=" and startday<='$end' and endday > '$end' and ordercnt!=sg_mnt";

// 프리미엄
select * from nara_sangpum where cod='O' and apremium != '' $enddays order by no desc limit 6

// 1000원샾
select * from nara_sangpum where cod='O' and thousand != '' and (aci_code like '01%' or aci_code like '03%') $enddays order by RAND() limit 4
select * from nara_sangpum where cod='O' and thousand != '' and (aci_code like '05%' or aci_code like '06%' or aci_code like '07%' or aci_code like '08%') $enddays order by RAND() limit 4

// 옥션포커스
select * from nara_sangpum where cod='O' and focus != '' $enddays order by RAND() limit 24

// 특이물품코너
select * from nara_sangpum where cod='O' and special != '' and (aci_code like '01%' or aci_code like '03%') $enddays order by RAND() desc limit 6
select * from nara_sangpum where cod='O' and special != '' and (aci_code like '02%' or aci_code like '04%') $enddays order by RAND() desc limit 6
select * from nara_sangpum where cod='O' and special != '' and (aci_code like '05%' or aci_code like '06%' or aci_code like '07%' or aci_code like '08%') $enddays order by RAND() desc limit 6

// 신규등록5
select * from nara_sangpum where cod='O' and aci_code like '01%' $enddays order by no desc limit 5
select * from nara_sangpum where cod='O' and aci_code like '02%' $enddays order by no desc limit 5
select * from nara_sangpum where cod='O' and aci_code like '04%' $enddays order by no desc limit 5

// 마감임박5
select * from nara_sangpum where cod='O' and aci_code like '01%' $enddays order by endday asc limit 5
select * from nara_sangpum where cod='O' and aci_code like '02%' $enddays order by endday asc limit 5
select * from nara_sangpum where cod='O' and aci_code like '03%' $enddays order by endday asc limit 5
select * from nara_sangpum where cod='O' and aci_code like '04%' $enddays order by endday asc limit 5
select * from nara_sangpum where cod='O' and (aci_code like '05%' or aci_code like '06%' or aci_code like '07%' or aci_code like '08%') $enddays order by endday asc limit 5


테이블 구조는 아래와 같습니다.
특별히 테이블 필드구조를 바꿈으로써도 sql 속도를 높일 수 있는 방법도 있는지요?

CREATE TABLE `nara_sangpum` (
  `no` int(10) unsigned NOT NULL auto_increment,
  `main_no` int(10) default '0',
  `code` varchar(10) NOT NULL default '',
  `aci_code` varchar(30) default NULL,
  `aci_cname` varchar(200) NOT NULL default '',
  `sgname` varchar(150) NOT NULL default '',
  `card` enum('y','n') default NULL,
  `cardprice` enum('y','n') default NULL,
  `receipt` varchar(70) default NULL,
  `sobija_mnt` int(30) default NULL,
  `sm_comment` mediumtext,
  `content` mediumtext,
  `comment_type` char(2) default NULL,
  `viewcnt` int(10) default '0',
  `max_ordercnt` int(10) default '0',
  `ordercnt` int(10) default '0',
  `regdate` int(10) NOT NULL default '0',
  `jukrip_mnt` int(10) default '0',
  `halin_mnt` int(10) default NULL,
  `common_info` mediumtext,
  `lank` int(1) default '0',
  `sg_code` varchar(50) default NULL,
  `sg_mnt` int(10) default '0',
  `shopname` varchar(50) default NULL,
  `sgname1` varchar(150) default NULL,
  `lanking` varchar(30) default NULL,
  `auction` enum('C','N','G') default NULL,
  `startday` varchar(50) default NULL,
  `endday` varchar(50) default NULL,
  `startprice` varchar(50) default NULL,
  `plusprice` varchar(50) default NULL,
  `baisong` varchar(30) default NULL,
  `unsong` varchar(100) default NULL,
  `f_file1` varchar(255) default NULL,
  `f_file2` varchar(255) default NULL,
  `f_file3` varchar(255) default NULL,
  `f_file4` varchar(255) default NULL,
  `f_file5` varchar(255) default NULL,
  `premium` varchar(50) default NULL,
  `apremium` varchar(50) default NULL,
  `Special` varchar(50) default NULL,
  `thousand` varchar(50) default NULL,
  `focus` varchar(50) default NULL,
  `bold` varchar(50) default NULL,
  `see` varchar(50) default NULL,
  `endproduct` varchar(50) default NULL,
  `auto` varchar(50) default NULL,
  `totalfee` varchar(50) default NULL,
  `userid` varchar(50) default NULL,
  `auction_date` varchar(10) default NULL,
  `pre` int(1) default '2',
  `nowprice` int(11) default NULL,
  `tender` int(11) default '0',
  `cod` enum('O','X') default 'O',
  `cod_text` mediumtext,
  `cod_email` varchar(100) default NULL,
  `product_see` int(30) default '0',
  `endchance` int(1) default '0',
  PRIMARY KEY  (`no`)
) TYPE=MyISAM


읽어 주셔서 감사합니다.
 
이 글에 대한 댓글이 총 3건 있습니다.

일단 조건부에 사용되는 컬럼인 cod 와 aci_code에 인덱스를 걸어주고 별도 컬럼도 지정한 후 쿼리도 수정해야 할것 같습니다.


alter table nara_sangpum add index cod (cod);

alter table nara_sangpum add column idx_aci_code char(2) not null default '';

update nara_sangpum set idx_aci_code = substring(aci_code,1,2);

alter table nara_sangpum add index idx_aci_code (idx_aci_code);


쿼리수정1. like 조건과 or 조건을 수정하면 좋을것 같네요.

예 : select * from nara_sangpum where cod='O' and aci_code like '01%' $enddays order by endday asc limit 5

수정 -> select * from nara_sangpum where cod='O' and idx_aci_code = '01' $enddays order by endday asc limit 5

예: select * from nara_sangpum where cod='O' and (aci_code like '05%' or aci_code like '06%' or aci_code like '07%' or aci_code like '08%') $enddays order by endday asc limit 5

수정 -> select * from nara_sangpum where cod='O' and idx_aci_code in ('05','06','07','08') $enddays order by endday asc limit 5


쿼리의 응답속도는 레코드 수와 많은 연관이 있기 때문에 딱히 말씀드리기는 어렵습니다만, 레코드 수가 많아질 수록 차이또한 커질 것입니다.

궁그미님이 2007-11-21 12:00에 작성한 댓글입니다.
이 댓글은 2007-11-21 12:01에 마지막으로 수정되었습니다. Edit

저도 DB에 대해 많이 알지는 못하지만 대부분의 쿼리가 cod가 포함되어 있고 이외 aci_code, startday, endday를 where조건절에서 사용하고 있네요... 그러므로
multicolumn index를 하나 만들어 주는게 좋을 듯 합니다.

alter table nara_sangpum add index idx_cod_aci (cod, startday, endday, aci_code(2));

아마도 이렇게 하면 인덱스가 꽤 커지겠지요... 하지만 속도면에서는 많이 빨라지겠네요...

아시겠지만 multicolumn index에서는 인덱스되어 있는 칼럼의 순서가 중요합니다.

또한 01%는 index를 타지만 %01하는 것은 인덱스를 타지 않습니다.

조금 이나마 도움이 되셨기를...

clay님이 2007-11-23 09:57에 작성한 댓글입니다.
이 댓글은 2007-11-23 10:05에 마지막으로 수정되었습니다. Edit

일반적으로 select시의 index만을 고려하는 경우가 많은데요, 당연히 insert하는 경우의 index도 고려해야 합니다.

잦은 insert를 통해 index를 많이 걸면 걸 수록 index의 크기가 커지고, 그 검색 속도 또한 느려집니다.

 

실제로 많은 테이블들이 불필요한 primary key, 잘못 사용된 multi column index등을 통해 실 data보다 훨씬 큰 인덱스들을 가지고 사용되고 있습니다. 큰 인덱스 자체가 잘못된 것은 아니지만, 큰 만큼 인덱스를 통한 검색도 느려지는 건 피할 수 없겠지요.

 

인덱스에 너무 의존하지 않고, 자주 사용되는 인덱스는 유지하고, 그 외의 경우는 사용자가 직접 캐시를 만들어 관리하는 것도 좋은 방법이라 생각됩니다.

박현우(lqez)님이 2007-11-26 12:21에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
27185결과값을 거꾸로 정렬해서 가져올 때 [1]
김수리
2007-11-21
2864
27184고수님들 my.cnf 세팅 내용좀 봐주세요 ..
권현진
2007-11-20
3263
27183동일한 서버ip내에서 서로 다른 데이터베이스일때 영향은? [1]
hhje22
2007-11-20
2429
27182최상의 처리속도를 얻기 위해 index key 를 어떻게 주어야 하겠는지요 [3]
강요찬
2007-11-20
3634
27181Mysql 이전버전의 패스워드를 상위버전으로 변환할 수 있는???? [1]
사튀밥
2007-11-19
2431
27180group by로 묶을때 묶이지 않는 값을 내가 원하는대로 뽑을려면.. [2]
임시손님
2007-11-19
2484
27179데이터베이스에 관해서 공부하려고 하는데... [1]
김주년
2007-11-19
2103
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다