인덱스란?
- 인덱스 : 색인 ( ex. 영어 사전의 a,b,c... )
- 어떤 테이블의 Column을 Index로 선정한 경우 해당 Column기준 조회기능의 성능을 향상시킬 수 있습니다.
- Where절 등을 통해 활용됩니다.
- 특징
- 항상 최신의 정렬상태를 유지합니다.
- Index도 Database객체입니다.
- Database크기의 약 10%정도 저장공간을 차지합니다.
- R기능은 이점이 있다 하지만 그 외 C,U,D기능에 대해서는 손해가 발생합니다.
- 사용하는 이유!
- 디스크 I/O와 메모리 I/O의 속도차이는 약 10만배이상 차이납니다. SSD 같은 좋은 디스크는 효율이 그나마 좋지만.. 디스크 I/O 수행은 성능상 피하는게 좋습니다.
- Web 서비스에서 보통 API 기능은 약 8:2 ~ 9:1( R : C+U+D ) 정도로 구성됩니다. 즉 조회기능이 압도적으로 많아서 index의 활용은 필수적입니다.
- 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 기본 인덱스로 사용된다.
추후.. 더 보충하겠습니다!
클러스터링 인덱스
- 특징
- 실제 존재하는 Data와 같은 무리의 Index입니다.
- 실제 Data 자체가 정렬됩니다. 즉, 추가적으로 인덱스 페이지를 만들지 않습니다.
- 테이블당 1개만 존재 가능합니다.
- Leaf 페이지 = Data 페이지
- PK 제약조건 설정 (우선) Or Unique && Not Null 제약조건 설정시 자동 생성됩니다.
논 - 클러스터링 인덱스
- 특징
- 실제 Data와 다른 무리의 Index입니다.
- 추가적으로 Index 페이지를 생성합니다 (= 저장 공간 필요)
- 테이블당 여러개가 존재할 수 있습니다.
- Leaf 페이지 = Data 페이지의 주소
- 외래키 설정시 Or Unique 제약조건 적용시 Or 직접 Index 생성시 자동 생성
! 주의 사항
- 자주 사용하지 않는 Index는 삭제합니다.
- 데이터 중복도가 높다면 인덱스의 효과가 작다.(= 카디널리티 낮음)
- 정말 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