인덱스의 개념
인덱스의 필요성
- 대량의 데이터에서 원하는 값을 빠르게 찾기 위해
- 모든 데이터를 처음부터 끝까지 순차 탐색하면 매우 비효율적
- 인덱스(index) 는 데이터를 빠르게 찾을 수 있도록 도와주는 부가적인 구조
인덱스의 정의
- 인덱스: 요청된 레코드에 빠르게 접근할 수 있도록 지원하는 탐색키 + 포인터 구조
- 인덱싱(indexing): 인덱스를 구성하는 작업
인덱스 종류
순서 인덱스 (Ordered Index)
- 탐색키를 정렬된 순서대로 저장하는 인덱스
- 범위 탐색에 유리하고, 이진 탐색 적용 가능
해시 인덱스 (Hashed Index)
- 탐색키를 해시 함수로 처리해 버킷 주소를 계산
- 빠른 정확한 값 탐색에 적합하지만 범위 탐색에는 부적합
인덱스 평가기준
기준 | 설명 |
접근 시간 | 인덱스를 통해 데이터를 찾는 데 걸리는 시간 |
유지 비용 | 삽입/삭제 시 인덱스를 재구성하는 데 드는 비용 |
공간 비용 | 인덱스를 저장하는 데 필요한 추가 공간 |
인덱스 크기에 따른 검색 성능
- 인덱스 크기 > 메모리 크기: 저장된 블록을 여러번 나누어 읽어야 하기 때문에 디스크 I/O 비용증가
- 인덱스 크기 < 메모리 크기: 디스크 I/O 줄어 탐색시간 축소
인덱스 엔트리
구조
탐색키값 | 포인터 | |
블록 ID | 오프셋 |
- 탐색키 값: 정렬 기준이 되는 데이터 값
- 포인터: 실제 레코드가 저장된 위치를 가리킴
인덱스 구성 방식
밀집 인덱스 (Dense index)
- 모든 레코드에 대해 인덱스 엔트리를 유지
- 빠른 탐색 가능
- 단점: 레코드 수만큼 인덱스 크기가 커져 조회 성능 저하
희소 인덱스(Sparse index)
- 일부 레코드만 인덱스에 포함
- 검색 시 인덱스에서 근접한 블록까지 찾고, 그 블록 내에서 선형 탐색
- 장점: 공간 절약, 유지비용 낮음
다단계 인덱스
- 4KB 크기의 한 블록에 100개의 엔트리가 삽입될때, 1억개의 레코드에 대한 밀집 인덱스(천개의 블록 = 4GB 공간 필요)
- 인덱스의 크기가 너무 커서 메모리에 다 못 올라올 경우 인덱스 자체를 또 인덱싱하는 방식
- 내부 인덱스 + 외부 인덱스 구조
- 외부 인덱스는 내부 인덱스를 가리킴 (희소)
- 내부 인덱스는 실제 레코드를 가리킴 (보통 밀집)
B+ 트리 인덱스
- 루트노드로부터 모든 단말노드에 이르는 경로의 길이가 같은 높이 균형 트리
- 순서 인덱스는 파일이 커질수록 데이터 탐색에 있어서 접근 비용이 커지는 문제점을 해결하기 위해 제안
- 상용 DBMS에서 널리 사용되는 대표적인 순서 인덱스
구성요소
- 인덱스 세트 (루트 노드 + 중간 노드)
- 단말 노드에 도달하기 위한 경로 제공
- 각 노드는 탐색키와 포인터들을 포함
- 자식 포인터 수: 최소 ⌈n/2⌉ ~ 최대 n
- 순차 세트 (단말 노드들)
- 실제 레코드를 가리키는 포인터 포함
- 인접 노드끼리 링크로 연결되어 있어 범위 탐색이 효율적
- 탐색키 수: 최소 ⌈(n - 1)/2⌉
B+ Tree 삽입/삭제
삽입/삭제 시 중요한 특징
- 항상 균형 유지 (균형 트리)
- 삽입은 분할(split) 로 해결
- 삭제는 병합(merge) 또는 재분배(redistribute) 로 처리
- 중간 노드는 탐색만, 실제 데이터는 단말 노드에만 존재
B+ Tree 삽입 과정
- 단말 노드에 새로운 <탐색키, 포인터> 삽입
- 키가 많아져 노드 용량 초과 시 → 노드 분할
- 중간값을 부모 노드로 승격
- 부모 노드도 넘치면 재귀적으로 분할 진행
- 트리의 높이가 증가할 수도 있음
B+ Tree 삭제 과정
- 삭제 대상 키를 단말 노드에서 제거
- 제거 후 키 개수가 최소 기준보다 작으면:
- 형제 노드와 키 재분배 시도
- 불가능하면 병합(merge)
- 병합 시 부모 노드에서 해당 키 제거
- 재귀적으로 병합되며 높이 감소 가능
'CS > 데이터베이스시스템' 카테고리의 다른 글
데이터 저장과 파일 (0) | 2025.04.30 |
---|---|
저장 객체 - 저장 프로시저/함수/트리거 (0) | 2025.04.27 |
정규화 (0) | 2025.04.27 |
SQL - 특수 연산자, 함수, 조인, 뷰 (0) | 2025.03.31 |
SQL - DDL & DML (0) | 2025.03.20 |