PE Notes · DB
데이터베이스 인덱스
B+ 트리 인덱스와 클러스터드·논클러스터드 차이, 키 룩업을 없애는 커버링 인덱스, 선택도와 복합 키 설계를 정리합니다.
표 전체를 훑으면 행이 늘수록 찾기가 선형으로 느려집니다. 인덱스는 책의 색인처럼 키 순서를 따로 두어 탐색을 로그에 가깝게 만듭니다. 대가는 저장 공간과, 삽입·갱신·삭제마다 구조를 고치는 비용입니다. 에서 인덱스를 늘리기 전에 이 풀스캔을 쓰는지부터 봅니다.
B+ 트리
대부분의 관계형 인덱스는 입니다. 키는 루트와 중간(브랜치)에 범위로만 있고, 실제 키와 행 위치는 리프에 있습니다. 리프는 옆으로 이어져 있어 범위 스캔이 싸습니다. 균형이 유지되므로 최악도 로그입니다.
해시 인덱스는 등호에 강하고 범위에 약합니다. 비트맵은 값이 몇 종류뿐인 열, 함수 기반은 UPPER(col)처럼 표현식 결과에 둡니다.
클러스터드와 논클러스터드
는 행 자체가 키 순서로 디스크에 놓입니다. 리프가 데이터 페이지입니다. 테이블에 하나만 둘 수 있고, 기본키에 붙는 경우가 많습니다. 범위 조회는 연속 페이지를 읽어 빠릅니다. 중간 키 삽입은 페이지를 나누는 비용이 납니다. 단조 증가 키는 그 분할을 줄입니다.
는 별도 트리입니다. 리프에는 키와 포인터(클러스터드 키 또는 RID)만 있습니다. 여러 개를 둘 수 있습니다. 찾은 뒤에는 본표(또는 클러스터드)를 한 번 더 봅니다. 그 추가 I/O가 입니다.
| 축 | 클러스터드 | 논클러스터드 |
|---|---|---|
| 물리 순서 | 키와 같음 | 무관 |
| 개수 | 1 | 여러 개 |
| 리프 | 행 자체 | 포인터 |
| 접근 | 한 번 | 룩업 추가 |
| 범위 조회 | 유리 | 상대적으로 불리 |
| DML | 정렬 유지 비용 | 별도 트리만 갱신 |
WHERE·JOIN·ORDER BY에 자주 나오는 열은 논클러스터드 후보입니다. 범위가 주 질의면 클러스터드 키를 그 열에 가깝게 고릅니다.
커버링과 설계
질의에 필요한 열이 인덱스에 다 있으면 입니다. 본표를 안 보므로 룩업이 사라집니다. 복합 키는 등호 조건·가 높은 열을 앞에 둡니다. 선두 열을 조건에서 빼면 인덱스가 무력해집니다.
| 상황 | 손질 |
|---|---|
| 날짜 범위 | 클러스터드 또는 범위에 강한 보조 인덱스 |
| 도시+나이 | 선택도 높은 열을 앞세운 복합 키 |
| SELECT 열이 적고 고정 | 커버링 |
| 로그성 INSERT | 단조 증가 클러스터드 키 |
| 값이 두어 개 | 인덱스 보류 또는 비트맵(DW) |
부분 인덱스는 조건에 맞는 행만 담습니다. 인덱스를 테이블마다 잔뜩 두면 쓰기가 먼저 죽습니다. 학습된 인덱스·벡터 인덱스는 별 구조이고, 관계형 기본은 여전히 B+ 트리입니다.