색인(Index)
인덱스의 개념
- 데이터 레코드를 빠르게 접근하기 위해 <키값, 포인터>쌍으로 구성된 데이터 구조
- 데이터베이스에서 검색 성능을 향상시키기 위해 미리 정렬해 놓는 기법
- 테이블과 클러스터에 연관되어 독립적인 저장 공간 보유
- 특정 열이나 열집합에 대한 빠른 검색 가능
- 추가는 'CREATE', 삭제는 'DROP'
인덱스의 목적
- 대규모 테이블에서의 빠른 데이터 추출
- 조건 검색, 정렬, MIN/MAX 처리의 효율성 향상
- JOIN 시 열 추출 효율성
인덱스의 종류
클러스터 인덱스(Clustered Index)
- 테이블당 1개만 허용, 해당 컬럼을 기준으로 테이블이 물리적으로 정렬
- 데이터는 기본적으로 오름차순 정렬
- 기본키 설정 시 자동으로 클러스터 인덱스 적용
- 인덱스 자체의 리프 페이지가 곧 데이터
- 데이터 입력/수정/삭제 시 항상 정렬 상태 유지
- 비클러스터형 인덱스보다 검색은 빠르지만, 입력/수정/삭제 느림
비클러스터 인덱스(Non-Clustered Index)
- 테이블당 약 240개의 인덱스 생성 가능
- 레코드의 원본은 정렬되지 않고 인덱스 페이지만 정렬
- 인덱스 자체의 리프 페이지는 데이터가 아니라 데이터가 위치하는 포인터이기 때문에
- 클러스터형보다 검색은 느리지만 입력/수정/삭제 빠름
- 인덱스를 생성할 때 데이터 페이지는 그냥 둔 상태에서 별도의 인덱스 페이지를 따로 생성하기때문에 용량 더 차지
밀집 인덱스
- 데이터 레코드 각각에 대해 하나의 인덱스 생성
희소 인덱스
- 레코드 그룹 또는 데이터 블록에 대해 하나의 인덱스 생성
인덱스의 구조
트리 기반 인덱스
- 대부분의 상용 DBMS에서는 트리 구조를 기반으로 하는 B+ 트리 인덱스를 주로 사용
비트맵 인덱스
- 비트(0/1)를 이용하여 컬럼값을 저장하고 이를 이용해 주소를 자동으로 생성
함수 기반 인덱스
- 함수나 수식으로 계산된 결과에 대해 트리 인덱스나 비트맵 인덱스를 생성, 사용할 수 있는 기능 제공
비트맵 조인 인덱스
- 비트맵 조인 인덱스의 물리적인 구조는 비트맵 인덱스와 동일
- 인덱스의 구성 컬럼이 베이스 테이블의 컬럼값이 아니라 조인된 테이블의 컬럼값이라는 차이
도메인 인덱스
- 개발자가 자신이 원하는 인덱스를 직접 만들어 사용하는 것(확장형 인덱스)
해시 인덱스
인덱스 컬럼(필드)의 선정⭐️
- 검색을 자주 하는 컬럼
- 정렬의 기준이 자주 되는 컬럼
- 기본키 및 외부키가 되는 컬럼
- OLE 개체 형식의 컬럼은 불가능
- 분포도가 좋은(10~15% 이내) 컬럼
- 가능한 수정이 빈번하지 않은 컬럼
- ORDER BY, GROUP BY, UNION이 빈번한 컬럼
- 자주 조합되어 사용되는 경우 결합 인덱스를 생성
- 한 컬럼이 여러 인덱스 포함되지 않도록 설계
인덱스 생성 시 고려사항⭐️
- 새로 추가되는 인덱스는 기존 액세스 경로에 영향을 미칠 수 있음
- 지나치게 많은 인덱스는 오버헤드 발생
- 넒은 범위 인덱스 처리 시 많은 오버헤드 발생
- 인덱스만을 위한 추가적인 저장 공간 필요
- 인덱스와 테이블 데이터의 저장공간이 분리되도록 설계
- 옵티마이저를 위한 통계 데이터를 주기적으로 갱신