클러스터링 Index와 논 - 클러스터링 Index

인덱스란?

  • 인덱스 : 색인 ( ex. 영어 사전의 a,b,c... )
  • 어떤 테이블의 Column을 Index로 선정한 경우 해당 Column기준 조회기능의 성능을 향상시킬 수 있습니다.
  • Where절 등을 통해 활용됩니다.
  • 특징
    1. 항상 최신의 정렬상태를 유지합니다.
    2. Index도 Database객체입니다.
    3. Database크기의 약 10%정도 저장공간을 차지합니다.
    4. R기능은 이점이 있다 하지만 그 외 C,U,D기능에 대해서는 손해가 발생합니다.
  • 사용하는 이유!
    1. 디스크 I/O와 메모리 I/O의 속도차이는 약 10만배이상 차이납니다. SSD 같은 좋은 디스크는 효율이 그나마 좋지만.. 디스크 I/O 수행은 성능상 피하는게 좋습니다.
    2. Web 서비스에서 보통 API 기능은 약 8:2 ~ 9:1( R : C+U+D ) 정도로 구성됩니다. 즉 조회기능이 압도적으로 많아서 index의 활용은 필수적입니다.
    3. Order By, Group By에서도 이득을 볼 수 있습니다.

인덱스의 종류 : 클러스터링 인덱스, 논 - 클러스터링 인덱스, 복합 인덱스, 커버링 인덱스 등...

 

더보기

사용되는 알고리즘

* 페이지 : 데이터가 저장되는 단위

  • Full Table Scan
    • 테이블의 모든 row를 순차적으로 탐색함
    • 적용 가능한 인덱스가 없는 경우 사용
    • 인덱스 처리 범위가 넓은경우 사용( 약 25 ~ 30 % 이상)
    • 테이블의 크기가 작은 경우
  • Binary Search Tree ( 이진트리 )
    • 균형 있는 이진트리를 탐색할 경우 : O(logN)
    • 균형 없는 이진트리를 탐색할 경우 : O(N)
    • 최악의 경우 시간 복잡도가 O(N)이어서 나온게  B - tree !!
  • B - Tree
    • 트리의 높이가 같다.
    • 한 노드가 자식을 2개 이상 가질 수 있다.
    • DB 기본 인덱스로 사용된다.

 

추후.. 더 보충하겠습니다!


클러스터링 인덱스

  • 특징
    1. 실제 존재하는 Data와 같은 무리의 Index입니다.
    2. 실제 Data 자체가 정렬됩니다. 즉, 추가적으로 인덱스 페이지를 만들지 않습니다.
    3. 테이블당 1개만 존재 가능합니다.
    4. Leaf 페이지 = Data 페이지
    5. PK 제약조건 설정 (우선) Or Unique && Not Null 제약조건 설정시 자동 생성됩니다.

논 - 클러스터링 인덱스

  • 특징
    1. 실제 Data와 다른 무리의 Index입니다.
    2. 추가적으로 Index 페이지를 생성합니다 (= 저장 공간 필요)
    3. 테이블당 여러개가 존재할 수 있습니다.
    4. Leaf 페이지 = Data 페이지의 주소
    5. 외래키 설정시 Or Unique 제약조건 적용시 Or 직접 Index 생성시 자동 생성

! 주의 사항

  1. 자주 사용하지 않는 Index는 삭제합니다.
  2. 데이터 중복도가 높다면 인덱스의 효과가 작다.(= 카디널리티 낮음)
  3. 정말 R기능이 많이 사용되는지 충분히 고려합니다.
더보기

카디널리티란?

  • 그룹 내 요소의 개수 = Column 중복도
  • 인덱싱한 Column에 똑같은 Data가 많다면? 조회하기 힘들기 때문에 중복도가 낮은( = 카디널리티가 높은 ) Column에 인덱싱하는것이 효과적입니다.

정리

인덱스의 적용은 테이블의 규모가 작지 않고, C,U,D기능이 자주 사용되지 않는 칼럼이며,  Where, Join, Order By절에 자주 사용되는 칼럼에 사용하도록 합니다.(중복도가 낮을수록 좋습니다!)


TEST

    • 목표
      • 클러스터링 인덱스, 논 - 클러스터링 인덱스, Full Table Scan을 수행하고 처리 시간을 비교한다.
    • 사용 데이터 : 공공 데이터 포털의 기상청 중기 예보 (https://www.data.go.kr/data/15043491/fileData.do?recommendDataYn=Y )
    • 위 data를 다운받고 임의로 data를 추가하여 약 11000건의 row를 가진 하나의 Table을 만들어 비교했습니다!
  • 결과
    • 클러스터링 인덱스 : 약 0.3ms
    • 논 - 클러스터링 인덱스 : 약 0.35ms
    • Full Table Scan : 약 5.2ms

( ! 결과는 실행 마다 다르게 나왔으나 보편적으로 위와 같은 처리 시간이 소요되었고 꾸준히 약 17배정도의 차이를 보였습니다.)

 

이상으로 클러스터링 인덱스와 논-클러스터링 인덱스에대해 간략히 알아보았습니다. 실제 PJT에도 적용해보고 TEST한 사례를 시간이된다면 추후 포스팅하도록 하겠습니다!

 

 


연관 포스팅 주제

1. 옵티마이저

2. 커버링 인덱스

3. InnoDB