[DB] 인덱스

HR·2022년 10월 10일
0

DataBase

목록 보기
1/4

인덱스란?

인덱스는 원하는 데이터를 쉽게 찾을 수 있도록 도와주는 책의 색인과 유사한 개념이다. 인덱스는 테이블을 기반으로 선택적으로 생성할 수 있다. 인덱스의 기본적인 목적은 검색 성능의 최적화이다. 즉, 검색 조건을 만족하는 데이터를 인덱스를 통해 효과적으로 찾을 수 있도록 돕는다.

하지만 INSERT, UPDATE, DELETE와 같은 DML 작업은 테이블과 인덱스를 함께 변경해야 하기 때문에 오히려 느려질 수 있다는 단점이 존재한다.

장점
1. 테이블 조회 속도 향상
2. 전반적인 시스템 부하 줄임

단점
1. 인덱스 관리 위해 추가적인 저장공간이 필요함
2. 관리하는데 추가 작업이 필요함
3. 잘못 사용하면 오히려 성능이 저하됨

항상 Index를 사용하는게 좋을까?
모든 컬럼에 인덱스를 추가한다면 본체보다 인덱스가 더 큰 용량을 필요로 하기 때문에 인덱스를 사용할 땐 항상 저장 공간을 생각해야 한다.

인덱스의 자료구조

해시 테이블
Key, Value로 데이터를 저장하는 자료구조로 빠른 데이터 검색이 필요할 때 유용하다. 해시 테이블은 Key값을 이용해 고유한 index를 생성하고, index에 저장된 값을 꺼내오는 구조이다.

하지만 DB 인덱스에서 해시 테이블이 사용되는 경우는 제한적이다. 이유는 해시가 등호(=) 연산에만 특화되었기 때문이다. 해시 함수는 값이 조금이라도 달라지면 완전히 다른 해시 값을 생성하는데, 이러한 특성은 부등호 연산이 자주 사용되는 데이터베이스 검색을 위해서는 해시 테이블이 적합하지 않다.

B-Tree

B-tree란 자식 노드가 2개 이상인 트리를 말한다.

B-Tree 인덱스는 가장 상위에 존재하는 루트 블록, 루트 블록과 리프 블록 사이의 브랜치 블록, 트리의 가장 아래에 존재하는 리프 블록으로 구성된다. 브랜치 블록은 분기를 목적으로 하는 블록이며, 다음 단계의 블록을 가리키는 포인터를 가지고 있다.

리프 블록은 인덱스를 구성하는 컬럼의 데이터와 해당 데이터를 가지고 있는 행의 위치를 가리키는 레코드 식별자로 구성되어 있다. 인덱스 데이터는 인덱스를 구성하는 컬럼의 값으로 정렬된다. 리프 블록은 양방향 링크를 가지고 있고, 이것을 통해 오름차순과 내림차순 검색을 쉽게 할 수 있다.

검색 과정

  1. 브랜치 블록의 가장 왼쪽 값이 찾고자 하는 값보다 작거나 같으면 왼쪽 포인터로 이동
  2. 찾고자 하는 값이 브랜치 블록의 값 사이에 존재하면 가운데 포인터로 이동
  3. 오른쪽에 있는 값보다 크면 오른쪽 포인터로 이동

해당 과정을 리프 블록을 찾을 때까지 반복한다. 만약 찾고자 하는 값이 존재하면 검색 성공이고, 그렇지 않은 검색 실패이다.

37이라는 값을 찾을 경우, 루트 블록에서 50보다 작으므로 왼쪽 포인터로 이동한다. 이후 11과 40의 사이의 값이므로 가운데 포인터로 이동한다. 이동 결과 해당 블록이 리프 블록이므로 37이 블랙 내에 존재하는지 검색한다. 37이 존재하면 검색 성고이다.

37과 50사이의 값을 찾고자 할때도 유용하다. (BETWEEN 37 AND 50) 리프 블록에서 37을 찾고 50보다 큰 값을 만날 때까지 오른쪽으로 이동하면서 인덱스를 읽는다. 해당 방법은 인덱스 데이터가 정렬되어 있고, 리프 블록이 양방향 링크로 연결되어 있기 때문에 가능하다. 인덱스를 경유해서 반환된 결과 데이터는 인덱스 데이터와 동일한 순서로 갖게 되는 특징을 가진다.

예제

오라클은 PK에 대해서 자동으로 인덱스를 생성한다고 한다.

-- 생성
CREATE INDEX [INDEX_NAME] ON [TABLE_NAME](COLUMN..)
CREATE INDEX EXAMPLE_INDEX ON EMPLOYEES(NAME)

-- 삭제
DROP INDEX [INDEX_NAME]
DROP INDEX EXAMPLE_INDEX

-- 수정
ALTER INDEX [INDEX_NAME] TO [NEW_INDEX_NAME]
ALTER INDEX EXAMPLE_INDEX TO NEW_INDEX_NAME

참고

https://mangkyu.tistory.com/96
https://coding-factory.tistory.com/419
SQL 전문가 가이드

profile
Hello World :D

0개의 댓글