음.. 어렵다 이개념
보통 인덱스는 두가지 종류로 나뉘나 보다.

클러스터드 인덱스                         넌 클러스터드 인덱스

1. 물리적으로 행을 재배열한다            그렇지 않다
2. 비교적 용량이 작다                        비교적 크다
3. 최대 갯수가 테이블당 1개                테이블당 249개
4. 인덱스의 레벨이 작다                     1만큼 더 크다
5. 상대적으로 검색속도가 빠르다         느리다
   (범위조회에 유용)
6. 선택도가 낮다(밀도가 높다)            선택도가 높다(밀도가 낮다)



1. 클러스터드 인덱스는 우선 물리적으로 행을 재배열 한다
무슨 말이냐...

다음과 같은 테이블을 생성했다 쳤을 때

create table test_index{

log_data char(8) not null,
id char(1) not null,
.....

primary key(log_data,id)

}

물론 저 조합으로 만들어진 주키가 중복없이 재 기능을 한다는 가정하에
20130611 a data
20130612 a data
20130612 c data
20130612 b data
20130608 c data

이런 순서로 insert를 했다.
실제 db에는 어떻게 저장이 될까??

단일 속성으로 이루어진 주키라면 주키의 오름차순이나 내림차순으로 정렬이 되어 저장이 된다.
=>이게 물리적으로 행을 재배열 한다는 뜻

이 경우에는 2가지 속성으로 이루어진 합성키가 주키의 역할을 하고있는데 앞에 쓰여진 것일 수록 우선순위가 높은가보다. 날짜순 정렬 -> id 순 정렬.. 대충 이런개 클러스터드 인덱스이다.

20130608 c data
20130611 a data
20130612 a data
20130612 b data
20130612 c data

반대로 넌클러스터드 인덱스는 조회문 향상을 위헤 인덱스를 생성해서 사용한다. 하지만 이 인덱스는 물리적으로 데이터가 정렬되지 않는다.

이건또 무슨말이냐... 조회문이라.. 쉽게 생각해서 클러스터드 인덱스가 사전이라면 넌클러스터드 인덱스는 책장 맨뒤에 주요단어들 모아놓은 그런 책이라고 생각해보자.

중요단어.................... p139
중요단어2...................p73

이런거 있잖아... 데이터를 가지고 어떤 위치(인덱스)에 있는지 조회한다고나 할까. 여튼 인덱스 테이블을 따로 만들어서 순서없는 데이터 테이블과 함께 데이터를 조회한다.  


2.용량 !!!!!

넌클러스터드 인덱스는 인덱스 페이지와 데이터페이지를 따로 관리하기 떄문에 비교적 용량이 더 크다.
(인덱스페이지... 테이블이라고 생각하면 되겠다)

http://lng1982.tistory.com/144

여기저기에서 지식을 모아다 작성하고는 있으나 가장 비중있게 참고했던 블로그의 출처를 살며시..
(b+트리 구조에서 클러스터드 인덱스와 넌클러스터드 인덱스의 데이터 찾는 방법 그림도 있음)

(귀찮아서..) 클러스터드 인덱스와 넌클러스터드 인덱스 모두 b+트리의 구조를 사용한다.(db 데이터를 대부분 이렇게 관리한다고 들었음)

무튼 클러스터드 인덱스는 리프레벨의 페이지가 곧 인덱스이자 데이터이므로 넌클러스터드 인덱스에 비해 낮은 레벨의 트리구조로 이루어져있다 이거다.


3.인덱스의 최대 갯수

인덱스가 물리적으로 정렬되어 있어서 한개 이상의 클러스터드 인덱스가 존재하면 꼬인다.... 뭔소린지 모르겠지만 영어사전에 abcd 말고 또다른 인덱스가 있다면 겁나 했깔리긴 할것 같다.
반면 !! 넌클러스티드 인덱스는 인덱스 테이블을 별도로 생성하여 사용하기때문에 인덱스가 많아도 상관 없다.
당장 학교에서쓰는 두꺼운 전공책을 펴고 뒤에 보면 ㄱ~ㅎ순의 인덱스 검색이랑 a~z 인덱스 검색이랑 2개나 있는걸 생각해보면 좀더 이해가 쉽지 않을까? 근대 이게 DB에선 최대 249개 쓸수 있단다.(왜그런지 나중에 찾아봐야지)

즉 클러스터드 인덱스는 인덱스와 데이터가 뭉쳐다니니까 인덱스가 여러개있음 안된다는거고 넌클러스터드는 인덱스가 몇개이던 어짜피 데이터와 따로노니까 결과적으로 데이터의 주소값만 얻으면 된다 이거다. 


4.인덱스 레벨 !! 은 용량얘기할때 했다.

5.검색속도 !!!

기본적으로 검색트리의 레벨이 큰만큼 속도가 오래 걸리기 마련이다. 게다가 그것이 범위검색이라면?
가령 20130613~20130615 사이에 로그를 뒤진다던가.. 이런 연속된 데이터의 검색이라면 클러스터드 인덱스가 압도적으로 빠를것이다.(넌 클러스터드 인덱스는 여기저기 흩어져있음..)


6.선택도..(생략, 할말도 없고 졸립다)


그렇다면... 넌클러스터드 인덱스는 왜쓰는걸까...? 정리하다보니 겁나 좋은점이 하나도 없어보인다.
(방금 넌클러스터드의 장점을 검색해봤다..)
구지 가져다 붙히자면 입력할 때 인덱스 정렬하는 시간을 단축할 수 있으므로 입력시간이 빠르다..?
음 뭔가 택배로 엄청 쌓아놓고 창고에 다 때려밖으면 일단 내방은 빨리 청소할 수 있지 않는가.,?

아마도 주키(인덱스) 속성이 아닌 데이터를 찾는데 유용하지 않을까 싶다. 음..? 그럴싸한데?
나만해도 방금 트리거 찾는다고 DB책 목차를 보기보단 맨뒤에 색인보고 찾았음..헐

그러니까 대한민국 공대생들은 전공책은 재본을 뜨기보단 돈좀 더 내고 사는게 바람직 하다고 생각한다. 내 알고리즘책 제본했는데 과대가 돈아낀다고 앞뒤 목차 다빼놓고 필요한부분만 제본을... 인덱스가 없다

아쉽게도 주변에 심도있게 물어볼 전문가가 없다... 취직하고싶다 빨리


-----(추가)----
이것저것 찾다보니 primary index라는 개념이 또... 클러스터디인덱스의 다른 말이란다. 기본색인 이라고도 불리우며 이는 주 키를 인덱스의 검색키로 하는 경우가 많지만 반드시 그럴 필요가 있는것은 아니다. 이는 밀집인덱스와 희소 인덱스로 구분된다.

밀집인덱스(dense) : 인덱스 엔트리는 파일에 있는 모든 검색 키 값에 대해 나타난다.
희소인덱스(spare) : 인덱스 엔드티른 검색 키 값에 대해 단지 몇개만 나타난다

사전을 보면

[abcdefg......vwxyz]  ---- >레벨 1. 사전 옆면에 a~z까지 표시된거
 ㅣㅣㅣㅣ.....ㅣㅣㅣ      ----> (나름 트리의 가지를 나타낸것)
[apple]....[apach]...[need]  -----> 레벨2. 사전 각 페이지의 상단 모퉁이에 시작과 끝 단어를 나타낸 단어들,
ㅣㅣㅣ       ㅣㅣㅣ      ㅣㅣㅣ                      얘네들을 희소인덱스라고 한다.
[] [] [] [] [] [] []..... [] [] []  -----> 레벨3. 우리가 찾고자 하는 단어, 밀집인덱스라고 한다. 실제로 밀집                                                                   인덱스 들은 각 단어를 정의하는 풀이문장들과 연결되어있다.
                                                                  (데이터베이스에서 주키가 나머지 속성값들과 연결되있음)



'~ 2014 > Database' 카테고리의 다른 글

트랜잭션  (0) 2014.06.15
트리거 trigger  (0) 2014.06.14
DDL / DML / DCL  (0) 2014.06.13

+ Recent posts