- 데이터베이스 테이블에 대한 검색 성능을 향상시키는 자료구조이다.
- 데이터베이스에서 원하는 값을 빠르게 찾기위해 사용한다!
인덱스를 사용하지 않는다면 Full Table Scan을 진행한다.
- 인덱스는 항상 최신의 정렬 상태를 유지한다.
- 인덱스도 하나의 데이터베이스 객체이다.
- 데이터베이스 크기의 약 10%정도의 저장공간이 필요하다.
데이터가 저장되는 단위
- 트리 높이가 같다.
- 자식 노드를 2개 이상 가질 수 있다.
-
루트 페이지
- 최상단에 위치한다.
- 자식 페이지의 정보를 갖는다.
-
브랜치 페이지
- 루프 페이지와 리프 페이지 사이에 여러 개가 존재할 수 있다.
- 자식 페이지의 정보를 갖는다.
-
리프 페이지
- 실제 데이터의 페이지(클러스터링 인덱스) || 실제 데이터의 주소 페이지(논클러스터링 인덱스)
B-Tree 를 사용한 인덱스를 통해 SELECT 성능이 향상된다!
그러나 INSERT, UPDATE, DELETE의 성능은 나빠진다.
-
INSERT
페이지가 꽉 차게 되면, 비어있는 페이지를 확보하고, 문제가 있는 페이지의 데이터를 공평하게 나누어 저장
즉, 페이지 분할이 일어나서 DB가 느려지고 성능에 영향을 준다!
-
DELETE
데이터를 실제로 지우지 않고 사용안함 표시를 한다.
-
UPDATE
- 데이터를 사용안함 표시를 한다.
- 새로운 데이터를 INSERT 한다.
정리: 페이지 분할과 사용안함 표시로 인덱스의 조각화가 심해져 성능이 저하된다!
- 실제 데이터와 인덱스가 무리를 이룬다.
클러스터링 인덱스를 만드는 방법
- primary key
- unique + not null 설정
클러스터링 인덱스의 특징
- 실제 데이터 자체가 정렬되어 있다.
- 테이블당 1개만 존재 가능하다.
- 리프 페이지가 데이터 페이지이다.
- primary key가 unique + not null 보다 높은 우선순위를 갖는다.
- 실제 데이터와 인덱스가 다른 무리를 이룬다.
논클러스터링 인덱스를 만드는 방법
- unique column 설정
- unque index 생성
- index 생성
논클러스터링 인덱스의 특징
- 테이블 당 여러 개 존재 가능하다.
- 리프 페이지에 데이터 페이지의 주소가 저장되어있다.
논클러스터링 인덱스의 리프 페이지에 클러스터링 인덱스가 적용된 칼럼의 실제 칼럼의 값을 저장한다.
새로운 데이터가 insert 될 때마다 실제 데이터 주소가 바뀌기 때문이다!
-
카디널리티가 높은 컬럼에 적용해야한다!
카디널리티는 그룹 내 요소의 개수이다.
예를 들어 성별의 카디널리티는 남, 녀 2개이다.
-
where, join, order by 절에 자주 사용되는 컬럼
-
INSERT/UPDATE/DELETE가 자주 발생하지 않는 컬럼
-
규모가 큰 테이블
[참고]
면접을 위한 CS 전공지식