인덱스란?

CinnamonTree·2022년 1월 10일
1

기술면접

목록 보기
1/2

인덱스에 대해서 설명해보세요.

인덱스란 데이터베이스 테이블의 검색속도를 향상시키기 위해 추가적인 저장 공간과 쓰기 작업을 활용하는 자료구조이다. 데이터베이스 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에, 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있게 한다.

인덱스를 활용하면 데이터를 조회하는 작업이 필요한 SELECT, UPDATE, DELETE 모두 성능이 향상된다. 인덱스를 사용하지 않은 컬럼을 조회할 때는 테이블 전체를 탐색하는 full scan이 이루어진다.

인덱스의 관리

DBMS는 값을 빠르게 탐색하기 위해 index를 항상 최신의 정렬된 상태로 유지시키는 작업을 행하는데, 이러한 작업들은 INSERT, UPDATE, DELETE가 수행될 때 추가적으로 실행되며, 그에 따른 오버헤드가 발생한다.

  • INSERT: 새로운 데이터에 대한 인덱스를 추가한다.
  • UPDATE: 기존의 인덱스를 사용하지 않게 처리하고, UPDATE된 데이터의 인덱스를 추가한다.
  • DELETE: 삭제하는 데이터의 인덱스를 사용하지 않는 작업을 진행한다.
  • UPDATE와 DELETE를 하면 기존의 인덱스를 삭제하지 않고 '사용하지 않음' 처리하기 때문에 이러한 연산들이 자주 발생하게 된다면 인덱스의 용량이 비대해져서 오히려 성능이 떨어질 수 있다.

인덱스를 사용하면 좋은 경우

  • 규모가 큰 테이블
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN, WHERE, ORDER BY에 자주 사용되는 컬럼

인덱스의 자료구조

인덱스에는 대표적으로 해시 테이블과 B+Tree자료구조가 사용될 수 있다.

[해시 테이블]
해시 테이블은 key,value로 데이터를 저장하는 자료구조로 빠른 검색을 사용할 때 유용하다.
해시 함수는 값이 조금만 달라져도 완전히 다른 해시값을 만들어내기 때문에, 등호(=)연산에 특화되어 있지만, 부등호 연산(>,<)이 자주 사용되는 데이터베이스 검색을 위해서는 해시 테이블이 그닥 적합하지 않다. 따라서 인덱스의 자료구조로는 보통 B+Tree가 사용된다.

[B+Tree]
B+Tree는 부등호를 이용한 순차 검색이 자주 발생될 수 있다는 점을 고려해 leaf node들을 LinkedList로 연결하여 인덱스에 맞게 검색을 최적화하였다.

다음과 같은 특성을 지닌다.

  • 리프(데이터)노드만 인덱스와 함께 데이터를 가지고 있고, 인덱스 노드들은 데이터를 위한 인덱스(key)만을 갖는다.
  • 리프노트들이 linked list로 연결되어 있다.
  • 데이터의 노드 크기가 인덱스 노드 크기와 같지 않아도 된다.

0개의 댓글