데이터베이스의 인덱스

개발세발·2024년 12월 17일

데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명해주세요.

인덱스가 뭐게요

  • 조회 성능 개선을 위한 데이터베이스 테이블의 열에 대한 별도의 자료구조이다.

특징

  • 항상 최신의 정렬 상태를 유지한다.
  • 인덱스도 하나의 엔티티이다.(컬럼을 복사한다.)
  • 엔티티이기 때문에 저장공간이 필요하다.

인덱스의 구조

B-Tree(Balanced-Tree)

  • 트리 높이가 같다.
  • 자식 노드를 2개 이상 가질 수 있다.
  • 데이터베이스의 일반적인 인덱스 구조이다.
  • 루트 페이지(루트니까 제일 위)와 브랜치 페이지(리프 페이지와 루트 사이)는 자식 페이지의 정보를 가지고 있다. 페이지: 데이터베이스에 데이터가 저장되는 단위!(MySQL은 16KB)
  • 리프 페이지: 실제 데이터 페이지(클러스터링) or 실제 데이터의 주소 페이지(논 클러스터링), 실제 데이터가 저장된 곳을 말한다.
  • 리프 페이지는 링크드 리스트 형태로 연결되어 있어, 순차적인 데이터 검색이 가능하다.
  • 최악의 경우에도 O(logN)으로 일정한 시간 복잡도를 가진다.
  • 문제점: 페이지 분할(페이지에 새로운 데이터를 추가할 여유 공간이 없어 페이지가 나뉘는 것으로, DB 성능이 저하된다.)
  • DELETE는 사용 안 함 표시를 한다.

Bitmap 인덱스

  • 각 값이 특정 위치에 존재하는지를 비트맵(0 또는 1)으로 기족한 구조이다.
  • 중복도가 높은 경우에 사용이 가능하다.(컬럼의 값의 개수가 적은 경우)
  • 데이터가 Bit로 구성되어 있기 저장 공간이 작아 효율적이다.
  • 복잡한 쿼리에 유리하다.(논리 연산이 가능하기 떄문)
  • 데이터 변경에 취약하다.
  • 많은 양의 데이터를 처리할 때 유용하다.

종류

클러스터링 인덱스

  • 실제 데이터와 같은 무리의 인덱스(aka 기본키)
  • 기본키 or Not Null+Unique 제약 조건을 걸어준다.(자동으로 생성된다.)
  • 루트와 브랜치는 각각의 자식 페이지의 페이지의 주소 값을 가지고 있어, 이를 데이터 조회에 사용한다.
  • 리프 페이지가 데이터 페이지이다.
  • 테이블당 1개만 존재한다.

논-클러스터링 인덱스

  • 실제 데이터와 다른 무리의 별도의 인덱스(aka unique 제약 조건)
  • Unique Index(중복 안됨) or Index(중복)
  • 리프 페이지에도 데이터 페이지의 주소가 저장된다.
  • 테이블에 여러 개가 존재한다.
  • unique 제약 조건 적용시 자동 생성된다.
  • 직접 index를 생성하면 논-클러스터링 인덱스이다.

둘을 짬뽕하면?(클러스터링+논-클러스터링)

  • 논-클러스터링으로 인덱스가 구성되고, 페이지 주소 값이 들어가지 않고, 실제 데이터 값(클러스터링 인덱스가 적용된)이 저장된다.

어디다 적용해야 할까

  • 카디널리티가 높은, 중복도가 낮은 것에 적용하자!(조회하려고 많은 인덱스를 안 거쳐도 되니까)
  • Where, Join, OrderBy 절이 자주 사용되는 컬럼
  • Insert, Update, Delete가 자주 발생하지 않는 컬럼
  • 규모가 작지 않은 테이블(큰 테이블)

주의사항

  • 잘 활용되지 않는 인덱스는 제거하자.
  • 중복도가 높으면 인덱스 효과가 적다.
  • insert, update, delete가 자주 일어나는지를 고려해야 한다.

0개의 댓글