인덱스??
데이터베이스의 사전목차와 같은 것으로 인덱스를 컬럼에 걸어주게 되면 검색 성능이 향상된다.
인덱스는 무조건 쓰면 좋은가??
인덱스의 간단한 특징에 대해서 설명해보자면, 인덱스를 생성해주면 특정 컬럼에 대해 검색 성능이 향상된다.
반면에, 인덱스를 위해 사용되어지는 추가적인 메모리 공간이 필요하고, INSERT, UPDATE, DELETE 시 기존의 데이터베이스 정보 뿐만 아니라, 인덱스 정보도 갱신해주어야 하기 때문에 성능이 떨어질 수 있다.
한 마디로 검색 성능과 삽입삭제성능의 트레이드오프(Trade-Off)관계!!
인덱스는 어떻게 이루어져있나?
내부적으로 여러 방식으로 구현하지만, 제일 보편적인 것이 B-Tree 인덱스이다.
B-Tree인덱스는 브랜치 블록(Branch Block)과 리프 블록(Leaf Block)으로 이루어진다. 브랜치 블록의 가장 최상위 노드를 루트 블록(Root Block)이라고 한다.
브랜치 블록은 분기를 위한 목적으로 활용된다. 브랜치 블록은 다음 단계를 가리키는 포인터를 가지고 있다.
리프 블록은 인덱스를 구성하는 컬럼의 데이터와 해당 데이터를 가지고 있는 행의 위치를 가리키는 레코드 식별자(RID, Record Indentifier/Rowid)로 구성되어 있다. 인덱스는 인덱스를 구성하는 컬럼의 값으로 정렬되어 있다. 리프블록은 양방향 링크(Double Link)를 가지고 있어, 오름차순, 내림차순으로 검색이 가능한 것이다.
B-Tree 인덱스는 "="으로 검색하는 일치(Exact Match)검색과 "Between", ">"와 같은 연산자로 검색하는 범위(Range)검색 모두에 적합한 구조이다.
B-Tree 인덱스가 구체적으로 어떻게 검색하는 것인가??
그렇다면 이러한 B-Tree를 이용해서 어떻게 데이터를 쉽게 찾아내는지에 대해서 그림을 보면서 설명하겠다.
1단계, 브랜치 블록의 가장 왼쪽 값이 찾고자 하는 값보다 작거나 같으면 왼쪽 포인터로 이동
2단계, 찾고자 하는 값이 브랜치 블록의 값 사이에 존재하면 가운데 포인터로 이동
3단계, 오른쪽에 있는 값보다 크면 오른쪽 포인터로 이동
예를 들어 37의 값을 찾고 싶다면??
37을 찾고자 한다면 루트블록에서 50보다 작으므로 왼쪽 포인터로 이동한다.
37는 왼쪽 브랜치 블록의 11과 40 사이의 값이므로 가운데 포인터로 이동한다.
이동한 결과 해당 블록이 리프블록이므로 37이 블록 내에서 존재하는지 검색한다.
또 예를 들어 만약 37~50의 값을 찾고 싶다면??
앞에서와 같이 37을 찾은다음에 정렬되어 있는 링크를 따라 50까지 검색해주면 된다. 완전 좋다!
'Database' 카테고리의 다른 글
트리거(Trigger) (0) | 2015.09.02 |
---|---|
데이터베이스 정규화 (4) | 2015.08.11 |