[DB] 인덱스(Index)
Index란
추가적인 저장 공간을 활용하여 테이블의 검색속도를 향상시키기 위해 사용
테이블의 모든 데이터를 검색하면(Full Scan) 시간이 오래 걸리기 때문에 Index를 사용하면 데이터의 위치를 포함하여 B+Tree 구조로 색인되어, 데이터를 빠르게 조회 할 수 있다.
Index는 하나 이상의 열에 생성이 되고 PK를 지정할 경우 자동으로 Clustered Index가 생성된다.
B+ Tree
- 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조
- Leaf 노드만 인덱스와 함께 데이터를 가지고 있고, 나머지 노드는 데이터를 위한 인덱스만을 갖는다.
- Leaf 노드는 연결 리스트로 연결되어 있다.
- 장점
- 테이블을 조회하는 속도와 성능을 향상 가능
- 전반적인 시스템의 부하를 줄일 수 있다.
- 단점
- 인덱스를 관리하기 위해 DB에 추가적인 저장공간이 필요함.
- 데이터가 추가 할 때 추가적인 작업이 필요
- INSERT, UPDATE, DELETE에서 성능이 하락할 수 있다.
Clustered Index
- 테이블당 하나만 생성이 가능
- 행 데이터를 인덱스로 지정한 열에 맞춰서 자동 정렬
- 사전처럼 내용 자체가 순서대로 정렬이 되어 있음
Clustered Index는 테이블의 데이터를 지정된 컬럼에 대해 물리적으로 데이터를 재배열 하고, 데이터가 테이블에 삽입되는 순서에 상관없이 Index로 생성되어 있는 컬럼을 기준으로 정렬되어 삽입 된다.
Index를 생성할 때 데이터 페이지 전체를 재정렬
Index Page를 [키- 데이터 페이지 번호] 로 구성하고, 검색하려는 데이터의 키 값으로 페이지 번호를 검색하여 데이터를 찾는다.
Non-Clustered Index
- 테이블당 여러개 생성 가능
Non-Clustered Index는 데이터를 정렬하지 않은 상태로 데이터페이지가 구성된다. 테이블의 데이터는 그대로 두고, 지정된 컬럼에 대해 정렬시킨 인덱스를 만든다.
Clustered Index보다 검색 속도는 느리지만, 데이터의 입력/수정/삭제는 빠르다.