티스토리 뷰

반응형

보통  PK로 Join을 하고 보통 우리는 PK로 많이 데이터베이스를 조회합니다. 이러한 이유는 여러가지가 있지만 그 중 논 클러스터링 인덱스와 클러스터링 인덱스의 차이에서 나오는 경우도 있는데요. MySQL을 기준으로 클러스터링 인덱스와 논 클러스터링 인덱스에 대해 알아보겠습니다.

인덱스 페이지

인덱스 페이지는 인덱스 트리의 각 노드에 해당하며, 데이터베이스 시스템은 인덱스 페이지를 사용하여 테이블에서 특정 행을 찾을 수 있습니다. 인덱스 페이지는 키 값에 대한 데이터 위치 정보를 갖고 있기 때문에, 데이터 베이스는 키 값을 인덱스에서 찾은 다음 그 데이터 위치 정보를 활용하여 테이블에서 행을 찾습니다.

 

인덱스 페이지는 데이터 베이스 시스템의 메모리 내부에 저장될 수도 있고, 디스크에 저장될 수 도 있습니다. 

리프 노드

리프 노드는 데이터베이스 인덱스의 구성 요소 중 하나로, 인덱스의 가장 하위 단계에 있는 노드입니다. 리프 노드는 인덱스의 키 값과 함께 해당 키 값에 대한 데이터 위치(행의 주소 혹은 오프셋)를 저장합니다. 리프 노드는 키 값에 대한 데이터 위치를 참조하는 포인터를 가지고 있으며, 이 포인터를 통해 데이터베이스 시스템은 빠르게 검색할 수 있습니다.

 

인덱스의 구조는 B Tree로 구성이 되어있는데 이러한 트리 구조 맨 밑에 있는 공간이 리프 노드입니다. 가장 많은 공간을 차지하며 인덱스의 크기와 성능에 큰 영향을 미칩니다.

루트 노드

인덱스 맨 위에 존재하는 노드입니다. 인덱스의 전체 구조를 유지하고, 인덱스를 탑색하는데 필요한 정보를 가지고 있습니다. 일반적으로 인덱스 중 가장 적은 공간을 차지합니다. 데이터베이스 시스템은 인덱스를 사용하여 데이터를 검색할 때 먼저 루트 노드에서 시작하여 하위 노드로 이동하며, 검색 데이터를 찾습니다. 따라서 루트 노드는 인덱스의 성능에 큰 영향을 미치며, 인덱스의 크기가 커질수록 루트노드에서 검색 속도가 느려질 수 있습니다.

클러스터링 인덱스

클러스터링 인덱스는 기본적으로 테이블 당 1개만 생성이 가능하며 보통 PK가 클러스터링 인덱스로 구성되어있습니다. 위에 설명드린 Root Node와 Leaf Node로 구성된 인덱스 페이지가 바로 그것이며, Root 페이지에서 하위 노드로 이동하면서 leaf 노드까지 이동하고 이 후 leaf 노드 까지 이동하면 데이터 위치를 참조하는 포인터를 획득하여 이 포인터를 사용하여 실제 데이터가 위치한 곳을 찾아 데이터를 가져옵니다.

논 클러스터링 인덱스

논 클러스터링 인덱스는 index page와 data page가 분리되어 있습니다. 논 클러스터링 index page에는 data page의 주소가 적혀있고 이 주소를 이용해서 data page에 존재하는 실제 데이터를 가져올 수 있습니다. 

 

다만 실제로 정렬된 테이블이 있는 것이 아니기 때문에 행이 추가, 삭제, 변경 되어도 영향을 받지 않지만 데이터 검색 시 인덱스 페이지에서 먼저 leaf 노드를 찾고 leaf 노드에 저장된 데이터 주소를 사용하여 데이터 페이지에서 검색 대상 행을 찾아와야 하므로, 클러스터링 인덱스에 비해 I/O 작업이 더 많이 필요합니다. 

비교

혹시나 한 번에 이해 안가는 분들을 위해 예시 비교 하면서 설명 드리겠습니다. 

 

member table에 id PK와 email 논 클러스터링 인덱스가 존재한다고 가정해봅시다. 그리고 다음과 같은 쿼리를 날린다고 가정해 봅시다. 

 

1. SELECT * FROM member as m WHERE m.email = 'ilgolc@naver.com'

 

2. SELECT * FROM member as m WHERE m.id = 12394

 

첫 번째 케이스에 경우 다음과 같이 탐색합니다.

 

  1. member table에서 email에 대한 논 클러스터링 인덱스를 검색합니다. 이를 위해 인덱스 페이지에 email 값이 'ilgolc@naver.com '인 노드를 찾습니다.
  2. 인덱스 페이지에서 찾은 노드가 참조하는 위치를 가져오고 이 때 클러스터링 인덱스를 사용하고 있는 table(id가 clusturing table)이기 때문에 데이터의 위치는 클러스터링 인덱스의 리프노드의 주소입니다.
  3. 클러스터링 인덱스의 leaf 노드의 주소를 사용하여 Member 테이블에서 해당 데이터를 가져옵니다. 이를 위해 인덱스 페이지에서 데이터 위치를 참조하는 포인터를 가져와서 실제 데이터 파일에서 해당 데이터를 가져옵니다.
  4. 데이터를 가져온 후 해당 데이터에 대한 필드 값을 읽어와서 반환합니다

반면에 클러스터링 인덱스는 leaf 노드에 실제 데이터가 저장되어 있기 때문에 데이터 페이지가 곧 leaf node입니다. 그렇기 때문에 바로 실제 데이터를 찾아가 필드 값을 읽어와서 반환하기 때문에 leaf 노드를 탐색 하지 않고 바로 값을 찾아옵니다. 

정리

인덱스에 전반적인 부분을 알아보았습니다. 결론적으로 클러스터링 인덱스는 Root 노드에서 바로 leaf 노드를 찾아 그 값을 통해 실제 데이터를 찾아간다면 논 클러스터링 검색하려는 데이터 위치를 찾기 위해 leaf 노드 까지 탐색해야 합니다. 

 

결론적으로 논 클러스터링 인덱스는 클러스터링 인덱스에 비해 I/O 작업이 상대적으로 오래걸릴 수 있습니다. 하지만 그래도 full-scan에 비해선 월등히 성능이 좋기 때문에 필요하다면 반드시 인덱스를 걸어 주는 것이 좋습니다. 

 

하지만 인덱스는 매번 생성될 때 인덱스 페이지에 인덱스 구조의 엔트리가 생성되므로 너무 많이 생성되면 용량이 많아져 병목으로 이어질 수 있으니 이 점을 고려해주시기 바랍니다.

 

마침.

 

Ref.

참고 : https://junghn.tistory.com/entry/DB-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EC%99%80-%EB%84%8C%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B0%9C%EB%85%90-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

[데이터베이스] 클러스터 인덱스와 넌클러스터 인덱스/ 개념 총정리

오늘은 인덱스의 종류인 클러스터 인덱스, 넌 클러스터 인덱스에 대해 정리해보겠습니다. 일단 인덱스란 데이터를 빠르게 검색할 수 있게 해주는 객체입니다. 컬럼을 정렬한 후에 데이터를 빠

junghn.tistory.com

 

https://ko.wikipedia.org/wiki/%EC%9D%B8%EB%8D%B1%EC%8A%A4_(%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4) 

 

인덱스 (데이터베이스) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 인덱스(영어: index)는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다. 인덱스는 테이블 내의 1개의 컬럼, 혹은 여러

ko.wikipedia.org

https://dduddublog.tistory.com/34

 

데이터베이스의 인덱스

목표1.단일 단계 인덱스에 대해 알아본다.2.다단계 인덱스에 대해 알아본다. 3.인덱스 선정 지침과 데이터베이스 튜닝에 대해 알아본다. 단일 단계 인덱스 만일 데이터베이스 접근을 오직 순차적

dduddublog.tistory.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함