인덱스 지식의 중요성
인덱스는 빠른 데이터 검색을 돕지만, 오히려 성능을 저하시키는 경우도 있다.
검색 성능을 높이는 조건들이 존재하며, 이를 알면 더 효율적으로 데이터베이스를 이용할 수 있다.
ex)테이블 크기가 작은 경우에는 인덱스를 사용하지 않는 것이 더 효과적이다. 접근하는 데이터의 양을 고려해야 한다.
단일 단계 인덱스
일반적으로 인덱스는 데이터 파일보다 크기가 작다.
따라서 데이터를 검색하는 것 보다 인덱스를 검색하는 것이 더 빠르다.
단일 단계 인덱스의 종류
- 기본 인덱스
- 클러스터링 인덱스
- 보조 인덱스
기본 인덱스 (Primary index)
탐색키가 데이터 파일의 기본키인 인덱스이다.
기본키 필드 하나, 데이터 위치에 대한 주소 필드 하나가 존재한다.
'희소 인덱스'라고도 불리며, 여러 행에 하나의 인덱스 엔트리를 가지는 구조이다.
인덱스가 I/O 블록 단위(페이지 단위라고도 한다.)로만 존재하며, 모든 행에 존재하는 것은 아니다. 그래서 '희소' 인덱스이다.
(인덱스 엔트리란 "인덱스 : 인덱스가 가리키는 데이터의 주소" 가 key : value를 이루는 형태)
클러스터링 인덱스 (Clustering index)
논리적으로 관련된 데이터끼리 디스크에 인접시켜 저장한다.
->부서별로 검색을 자주하는 경우, 부서 컬럼별로 인접시켜 물리적으로 저장
비슷한 자료를 찾아서 그 근처에 저장하기 때문에 입력 속도는 느리다.
보조 인덱스 (Secondary index)
넌 클러스터링 인덱스 (Non-clustering index)와 같은 의미이며, 밀집 인덱스라고도 불린다.
모든 행에 대해 탐색키를 가진다.
기본 인덱스에 비해 순차 접근시 더 느리다. 테이블에 더 많은 인덱스가 있기 때문에 엔트리 갯수가 많고, 검색 시간과 저장 공간이 더 필요하다.
하지만 임의의 위치에 대한 탐색은 기본 인덱스보다 빠르다.
다단계 인덱스
인덱스가 너무 많아지면, 인덱스를 찾는 시간이 오래 걸리게 된다.
인덱스에 대한 인덱스를 또 만드는 것이 다단계 인덱스이다. 따라서 인덱스 엔트리의 삽입과 삭제가 매우 복잡하다.
원래 인덱스 파일이 첫 번째 단계 인덱스이며, 그 인덱스에 대한 인덱스를 두 번째 단계 인덱스라 부른다.
이 때, 첫 번째 단계 인덱스에는 어떠한 유형의 인덱스든(기본, 클러스터링, 보조 ...) 사용 가능하다.
최상위 인덱스를 마스터 인덱스라 부른다.
B tree 인덱스, B+ tree 인덱스 (Balance tree index)
관계형 데이터베이스에서 가장 일반적으로 사용한다.
트리의 균형을 항상 유지해주어야 한다. 데이터가 삭제되어 디스크 공간이 빌 수 있는데, 이러한 메모리 낭비를 감수해야 한다.
이진트리를 유지하기 위해 삽입, 삭제 시 어려움이 있다.
새로운 키는 항상 leaf에 삽입되는데, leaf에 여유 공간이 있으면 정렬순에 따라 적당히 삽입한다.
하지만 leaf에 여유 공간이 없다면 leaf를 두 개의 노드로 분할한다.
[ 77 | 81 ] 의 노드에 83을 추가할 경우, [ 77 | 81 | 83 ] 을 두 개의 노드로 분할하게 된다.
이때, 가운데 값인 81은 그대로 부모위치에 두고, 77과 83을 새로운 leaf로 분할하여 내려보낸다.
부모노드에는 81에 더해 leaf노드들에 대한 포인터가 함께 저장된다.
데이터가 이진트리로 저장되어 있으므로, 각기 다른 가지에 있는 leaf를 검색할 경우, 그 위의 가지를 모두 타고 내려와야 한다는 단점이 있다.
이를 개선한 것이 B+ tree 인덱스인데, leaf들을 LinkedList로 연결해둔 형태이다.
줄기를 여러번 탐색할 필요 없이, Leaf로 한 번 내려온 이후 다른 Leaf로 바로 탐색할 수 있다.
댓글