Table에서 Index로 지정한 칼럼을 기준으로 메모리 영역에 일종의 목차를 만드는 것
Index를 사용한다면, Insert, update, delete 시에 Index를 갱신하는 과정이 추가되므로 저장 속도를 희생
단, Select 시에는 Index를 통해 해당 데이터에 빠르게 접근할 수 있음
따라서, 데이터 저장 작업을 얼마나 희생하여 읽기 작업의 속도를 높일 것인지에 따라 인덱스를 추가할지에 대해 결정해야 함
칼럼의 값을 Key로, 해당 레코드가 저장된 주소를 Value로 저장하며, Key를 기준으로 정렬하여 보관
RDBMS에서 Index를 구성하는 알고리즘은 대표적으로 B-Tree 인덱스와 Hash 인덱스로 구분
B-Tree 알고리즘은 칼럼의 값을 변경하지 않고 원래의 값을 이용해 인덱싱
Hash 알고리즘은 해시값을 계산해서 인덱싱, 하지만 값을 변형하여 인덱싱 하므로 범위 검색에는 취약
B-Tree(Balanced Tree, Not Binary)
B-Tree는 부모 노드가 2개의 자식 노드를 갖는 이진트리를 확장하여 N개의 자식 노드를 갖도록 고안된 것
특징
이 때 주의해야 할 사항은 인덱스는 순차로 정렬되어 있지만, 데이터 파일의 레코드는 정렬되어 있지 않을 수 있다는 것
이유는 Insert 순으로 저장된다고 하더라도, 데이터가 삭제되어 빈 공간이 생긴다면 그 다음 Insert에서 빈 공간을 재활용하기 때문
여기서 LeafNode에 있는 데이터 == 실질적으로 데이터가 저장되어 있는 위치일까?
Clustered Index
Non-Clustered Index
앞서 이야기 한 것처럼, 전체 테이블의 20~25% 이상의 레코드를 조회해야 하는 Query라면, Index를 이용하기 보다 Full Scan 방식이 더 효율적일 수 있음
Index를 통한 검색 Query는 데이터베이스에 Single Block I/O 기반으로 처리하기 때문
Single Block I/O는 하나의 block을 I/O로 담아서 나른다고 이해할 수 있음
즉, 소량의 데이터를 읽을 때 효과적임
반대로 Table FULL scan의 경우에는 Multi Block I/O기반으로 처리함
Multi Block I/O는 여러 개의 block을 한번에 I/O로 담아서 나른다고 이해할 수 있음
즉, 대량의 데이터를 읽을 때 효과적임