1. 데이터베이스 인덱스(Database Index)란?

  • 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료구조
  • 책에 있는 목차와 같은 개념으로, 인덱스에서 내가 원하는 데이터를 먼저 찾고 저장되어있는 물리적 주소로 찾아가게 된다.

👍 인덱스를 사용하는 이유

  • 조건검색 Where 절의 효율성 향상

    • 테이블 레코드는 순서 없이 저장되어 Where 절의 조건에 맞는 데이터를 찾을 때 처음부터 끝까지 다 읽게 된다(Full Table Scan)
    • 인덱스 테이블은 데이터가 정렬되어 저장되어있어 Where 조건에 맞는 데이터를 빠르게 찾을 수 있다.
  • 정렬 Order by 절의 효율성 향상

    • Order by는 부하가 많이 걸리는 작업(1차적으로 메모리에서 정렬 발생 & 메모리보다 작업이 큰 경우 디스크 I/O발생)
    • 인덱스를 사용하면 이미 정렬이 되어있어 Order by에 의한 sort과정을 피할 수 있다.
  • Min / Max의 효율적 처리

    • 레코드의 시작값 & 끝 값 한 건만 가져오면 되기 때문에 Full table scan을 하지 않고 min/max값을 찾을 수 있다.

👎 인덱스(Index)의 단점

인덱스가 정렬된 상태를 계속 유지시켜야 하기 때문에 레코드 내 데이터 값이 바뀌면

  • Index 테이블 값을 다시 정렬해야한다.
  • Index 테이블, 원본 테이블 두 군데에 수정 작업이 필요하다.

또한, 인덱스는 테이블의 전체 데이터 중 10~15% 데이터를 처리하는 경우에만 효율적이고 그 이상일 경우에는 사용하지 않는 것을 추천.

인덱스를 관리하기 위해 데이터베이스의 추가 저장공간(약 10%)이 필요하다.

✨ 인덱스(Index)를 사용하면 좋은 경우

  • 규모가 작지 않은 테이블
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN, WHERE 또는 ORDER BY에 자주 사용되는 컬럼
  • 데이터 중복도가 낮은 컬럼
  • 기타

2. 데이터베이스 인덱스 자료구조

인덱스를 구현하기 위해 다양한 자료구조를 사용할 수 있지만, 가장 대표적 예인 해시테이블과 B+Tree에 대해 알아보도록 하자.

[해시 테이블(Hash Table)]

  • Key-Value 형태로 데이터를 저장하는 자료구조로 빠른 데이터 검색이 필요할 때 유용하다.

  • Key값을 이용해 고유한 Index를 생성하여 해당 Index에 저장된 값을 꺼내오는 구조이다.

  • DB인덱스에서 해시테이블이 사용되는 경우는 제한적이다 → 해시가 등호 연산에만 특화되어있기 때문이다(부등호 연산을 자주 사용하는 DB 검색에는 해시테이블이 적합하지 않다)

[B+Tree]

  • 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조로, 모든 노드에 데이터(Value)를 저장했던 B Tree와 다른 특성을 가진다.
    • 리프 노드(데이터 노드)만 인덱스와 함께 데이터(Value)를 가지고 있고, 나머지 노드(Index 노드)는 데이터를 위한 인덱스(key)만을 갖는다.
    • 리프 노드들은 Linked List로 연결되어있다.
    • 데이터 노드 크기는 인덱스 노드의 크기와 같지 않아도 된다.
  • 인덱스 컬럼에서는 부등호를 이용한 순차 검색 연산이 자주 발생할 수 있어 B Tree의 리프 노드들을 Linked List로 연결해 순차 검색을 용이하게 하는 등 B Tree를 인덱스에 맞게 최적화하였다.