[database] 인덱스
Updated:
개요
- 데이터의 위치를 가리키는 자료구조
- n개의 컬럼에 대해 정렬하여 키와 레코드 포인터를 저장
장점
- 모든 행을 검색(full table scan)하지 않으므로 조회 속도 향상
- 데이터가 정렬되어 있으므로 where, order by, min, max 등의 성능 향상
단점
- 인덱스 관리를 위한 저장 공간 필요
- 삽입, 수정, 삭제 시 인덱스 관리를 위한 오버헤드 발생
- 수정, 삭제 시 인덱스를 삭제하지 않고 사용하지 않음으로 처리하기 때문에 수정, 삭제가 빈번할 경우 오히려 성능 하락 가능성 존재
인덱싱 종류
- clustered
- 레코드의 물리적 순서를 지정
- 물리적 순서가 지정되므로 Clustered index는 하나만 생성 가능
- 따로 설정하지 않을 경우 기본키 설정 시 자동으로 생성
- 테이블 자체가 인덱스 페이지
- 저장 순서와 순차적 혹은 역순으로 액세스 하는 경우 검색 속도 크게 향샹
- non-clustered에 비해 조회는 빠르지만 삽입, 수정, 삭제는 느림
- 수정이 빈번하지 않거나 범위(MAX, MIN, COUNT 등), group by 등의 조회를 자주하는 경우에 유리
- non-clustered
- 레코드의 논리적 순서를 지정
- 데이터의 위치를 가리키는 별도의 인덱스 페이지 생성
- n개 생성 가능
- clustered에 비해 조회는 느리지만 삽입, 수정, 삭제는 빠름
- 수정이 빈번하거나 조건(where, join) 조회를 자주하는 경우 유리
- cluster
- 멀티 데이터베이스와 멀티 테이블이 조인된 경우 사용
- 클러스터 키 값을 공유하는 테이블의 레코드를 동일하거나 가까운 데이터 블록에 저장함으로써 I/O 오버헤드를 줄여 조인 성능 향샹
종류
- bitmap index
- 데이터를 비트맵에 저장하여 동작하는 인덱스
- 데이터가 한정(성별 등)되어 있고 자주 사용되는 경우 유용
- dense index
- 모든 레코드에 대한 키와 포인터 쌍을 가진 파일을 이용하는 인덱스
- sparse index
- 모든 블록에 대한 키와 포인터 쌍을 가진 파일을 이용하는 인덱스
- reverse index
- 키를 뒤집어서 인덱싱
- 시퀀스 번호인 경우 유용
- primary index
- 테이블의 키 필드와 키가 아닌 필드에 대한 포인터를 포함
- 테이블이 생성될 때 자동으로 생성
- secondary index
- 키 필드가 아닌 필드를 인덱싱하는데 사용
- hash index
- 해시를 이용하여 인덱싱