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 29656 게시물 읽기
No. 29656
여러게의 필드를 하나인덱스에 넣었을때 어떤차이가 있나요.
작성자
VQ
작성일
2010-05-17 06:36
조회수
8,069

예를들어

KEY `ixs` (`f1`,`f2`,`f3`,`f4`) USING BTREE

KEY `ix_f1` (`f1`) USING BTREE
KEY `ix_f2` (`f2`) USING BTREE
KEY `ix_f3` (`f3`) USING BTREE
KEY `ix_f4` (`f4`) USING BTREE

 

이렇게 하면 이 둘은 어떤 차이가 나죠

전자에 나온 것 처럼 한번에 잡았는데 그 차이를 알고 싶습니다.

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

안녕하세요 박성원입니다.

 

multi inex에 대한 문의군요!! 이거참 초반에는 매우 힘든 개념이지만 한번 집고 넘어가면 그리 어렵지 않습니다. ^^

 

자 우선 질문에 줄바꿈이없으므로 임의로 보면

1. index

KEY `ixs` (`f1`,`f2`,`f3`,`f4`) USING BTREE

 

2. index

KEY `ix_f1` (`f1`) USING BTREE
KEY `ix_f2` (`f2`) USING BTREE
KEY `ix_f3` (`f3`) USING BTREE
KEY `ix_f4` (`f4`) USING BTREE
 

이 두가지의 차이를 말씀하시는게 맞죠 ^^?

 

우선 멀티키에 대한 이야기 부터 진행할께요

멀티키는 특정쿼리의 where절 구문이 항상 동일한 루틴으로 접근할때 단순히 여러개의 컬럼을 묶어서 사용하는 방법입니다.

 

즉,

select a, b from table where a=1 and b=2

select a, b, c from table where a=1 and c=3

select c from table where a=1

이런식으로 말이죠 ^^

 

즉, unique한 특정 컬럼을 반드시 포함하고 몇개의 컬럼이 where절에 포함된다면 이는 항상 비슷한 패턴으로 들어오기 때문에 multikey를 생성하여 index를 타게 할 수 있습니다.

 (* 기준 컬럼이 항상 Unique 할 필요는 없습니다. 타 컬럼보다 구분되는 값이 많으면 좋겠죠 ^^)

 

단일 key의 경우에는

select a, b from table where a=1 and b=2

select b, c from table where b=2 and c=3

 

 

즉, 들어오는 query에 특정 패턴이 없으며 쿼리가 다양할 경우입니다.

이때는 단일컬럼으로 쿼리를 잡기 때문에 어떠한 경우던지 인덱스를 타게 되는것이지요 ^^

 

흠.. 어렵나요?

정리를 하면

multikey의 경우 묶어둔 index는 최상위 key(상기에서는 unique한 컬럼을 말합니다.)를 반듯이 포함해야

index를 거칩니다.  물런, 이것이 아니라해도 index scan의 형태로 검색은 합니다만, 속도의 차이가 많이 나겟죠?

single index의 경우 각개별의 index를 만들기 때문에 select나 where절 어디에서든지 index를 매우 효율적으로 사용할 수 있습니다.

 

흠.. 그럼 여기서 한가지 문의가 생기죵? 왜 굳이 multikey를 사용해서 index를 구성할까? 입니다.

네.. 조금 생각해보면 답이 있겠지요 ^^

 

index라는것은 data가 insert 될때마다 증가하도록 설계되어있습니다. 당연하죠? 데이터가 있으면 당연히 그에 해당하는 index가 늘어날테니까요 ^^

단일키의 경우 몇개의 index를 동시에 만들기때문에 multikey에 비해서 index file 자체보다 큰 용량을 필요로 하게 됩니다.

실제로 무분별한 index의 남용은 효율적이지 못하고 disk의 큰 i/o만 발생시키기도 합니다.

 

그럼 이정도로 정리를 해볼까요 ^^

 

multikey는 실무에서 많이 사용되는 개념입니다. 이 기회에 꼭 정리하시길 바랍니다.

 

 

그럼 건승하시길....

박성원(darkancia)님이 2010-05-17 11:47에 작성한 댓글입니다.
이 댓글은 2010-05-17 14:08에 마지막으로 수정되었습니다.

성원님의 정성 넘치는 답변이군요 ^^ 요새 좀 불타오르시는 듯~

 

추가로 말씀드리면, 멀티 컬럼 인덱스를 쓰는 다른 이유는 MySQL에서 하나의 대상에 대한 WHERE 구문 처리시, 하나의 인덱스만을 쓸 수 있기 때문입니다. 일반적으로 용량에서는 컬럼별로 나누는 것이 더 적게 나옵니다. ( f1의 Cardinality가 100, f2가 100 일때, 별도로 잡으면 100+100=200 이지만, 멀티키로 잡으면 100x100 = 10,000이 됩니다. 정확하게 이런 크기라는 얘기가 아니라 대략적으로 그렇습니다. )  -> 성원님의 제보로 확인해보았는데, 싱글키를 각각 따로 만드는 것의 용량이 더 크게 나옵니다. 감사합니다.

 

WHERE f1='...' AND f2='...' 과 같은 조건이 들어 왔을 때, 제시해주신 인덱스들 중 일반적인 경우라면 ixs를 통해 가장 빠르게 답을 찾을 수 있습니다. ix_f1과 ix_f2가 별도로 있다면 두 인덱스 중 Cardinality가 높은 값을 기준으로 하나의 인덱스만 사용하게 됩니다.

박현우(lqez)님이 2010-05-17 15:19에 작성한 댓글입니다.
이 댓글은 2010-05-17 16:50에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
29660아래 질문한거 재 질문입니다 [2]
윤은숙
2010-05-18
7908
29658프로시저 관련 질문입니다. [2]
백승범
2010-05-17
8843
29657oracle TO_NUMBER를 Mysql로 변경하기 [1]
인투폴
2010-05-17
15040
29656여러게의 필드를 하나인덱스에 넣었을때 어떤차이가 있나요. [2]
VQ
2010-05-17
8069
29655여러 클라이언트에서 데이터를 하나씩 꺼내갈때 [2]
김대일
2010-05-15
7298
29654특정 문자열만 포함 하는 쿼리 가능한가요? [1]
이홍섭
2010-05-14
8452
29653그룹별 개수 및 합계구하는거 좀 알려주세요~ [10]
윤은숙
2010-05-13
9860
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다