- 설명
- 데이터베이스 테이블 검색 성능을 높여주는 자료구조
- 특정 컬럼에 인덱스를 생성하면 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함꼐 저장
- 인덱스 참조 시 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 조회해 오는 방식
- 책에 있는 목차라고 생각
- 사용이유
- where 검색의 효율성
- 데이터가 쌓이면서 내부적으로 순서가 뒤죽박죽 저장되는데 인덱스가 없거나 참조하지 못한다면 FTS
- 인덱스 테이블은 데이터가 물리적으로 저장되어 있기 떄문에 조건에 맞는 데이터들을 빠르게 조회
- order by의 효율성
- 인덱스 생성 시 정렬하여 저장하기 때문에 부하가 큰 order by에서 효과적
- Min, max 처리
- 시작과 끝 값을 한건만 가져오기 때문에 FTS보다 효율적
- 단점
- 정렬된 상태를 계속해서 유지해야하기 때문에 DML로 인한 레코드 내 데이터 값 변경 시 인덱스를 재정렬 해야하기 때문
- 무조건 index가 좋은 것이 아니라 전체 데이터의 10~15% 조회 시 유리하며 대용량 데이터 조회 시 FTS이 유리할 수 있음
- 인덱스가 저장공간을 차지하기 때문에 스토리지 관리에도 고려해야함
- 인덱스 생성 전략
- 조건절에 자주 등장하는 컬럼
- 항상 = 으로 비교되는 컬럼
- 선택도가 낮은 컬럼
- 정렬을 자주하는 컬럼
- 조인 조건건으로 사용 되는 컬럼
- B*tree 인덱스
- 설명
- DBMS에서 가장 많이 사용되는 인덱스 구조는 밸런스드 트리 인덱스
- 항상 정렬된 상태를 유지하기 때문에 시간복잡도가 O(logN)이므로 탐색 시간에 매우 효율적인 자료구조
- 항상 좌우 자식 노드 개수의 밸런스를 유지하기 때문에 최악의 경우에도 O(logN) 시간을 유지하기 떄문
- B tree가 DB 인덱스 용도로 가장 적합한 자료구조인 이유
- 항상 정렬된 상태로 특정 값보다 크고 작은 부등호 연산에 문제가 없음
- 참조 포인터가 적어 방대한 데이터 양에도 빠른 메모리 접근 가능
- 데이터 탐색 뿐만 아니라 저장, 수정, 삭제에도 항상 같은 시간 복잡도를 가짐(O(logN)
- 데이터 접근이 빠른 자료구조인 배열이 db 인덱스로 선택 받지 못하는 이유
- 배열 내에서 데이터 저장, 삭제가 일어나는 순간 B-tree보다 비효율적인 성능이 발생함
- 중간에 데이터 삽입 시 해당 데이터보다 큰 데이터는 한 칸씩 뒤로 물러나게 되는데 이때 발생하는 평균 시간 복잡도가 O(N+logN) = O(N)
- 즉 일관적으로 빠른 시간복잡도를 유지하기 위해서 B-tree로 선택