[DB] 인덱스란?

kdkdhoho·2023년 6월 29일
0

CS 지식

목록 보기
1/1

데이터베이스에서 인덱스란?

데이터를 빠르게 찾기 위한 자료구조이다.
저장된 데이터 중 특정 데이터를 찾으려면, 가장 단순한 방식으로는 데이터를 모두 조회하는 것이다.
하지만 데이터의 수가 정말 많아진다면 특정 데이터를 조회하는 일은 높은 비용의 작업이 된다.
따라서 조회를 효율적이고 빠르게 하기 위한 방법이 필요했고, 인덱스는 그 방법 중 하나이다.

인덱스를 쉽게 이해하기 위해 흔히 접할 수 있는 사례로는 책의 '목차'라고 생각한다.
페이지 순서대로 각각의 주제를 표시한 목차를 통해, 우리가 원하는 페이지를 빠르게 펼칠 수 있다.

즉, 인덱스는 데이터 조회 시에 효율적인 작업을 위한 자료구조이다.


인덱스의 특징

항상 정렬된 상태여야 한다.

인덱스는 기본적으로 데이터가 특정 기준으로 정렬이 된 상태여야 한다.
정렬된 상태를 기반으로 데이터를 조회하기 때문이다.

따라서 데이터가 추가, 삭제, 갱신이 될 때마다 신경써줘야 한다.

하나의 칼럼이다.

인덱스는 하나의 테이블 안에 존재하는 정렬된 하나의 칼럼이다.
따라서 추가적인 공간 복잡도가 발생한다.

다양한 유형의 인덱스가 존재한다.

데이터베이스마다 인덱스를 구현하기 위한 자료구조는 다를 수 있다.
B-Tree, B+Tree, Hash 등이 있다.
많이 사용하는 MySQL의 경우 B-Tree를 사용한다고 한다.


클러스터 인덱스와 넌클러스터 인덱스

인덱스는 2가지 종류로 나뉜다.

클러스터 인덱스

데이터가 실제 물리적으로 정렬되어 저장된 상태를 참조한다.
실제로 저장된 상태를 참조하기에, 중간에 추가/삭제가 일어나면 재정렬을 해줘야한다.

가장 쉽게 적용하는 방법으로 칼럼에 PK를 걸어주면 데이터베이스가 알아서 클러스터 인덱스를 생성해준다.
혹은, NOT NULL과 UNIQUE 제약조건을 모두 걸어주는 것이다.

테이블 당 1개의 클러스터 인덱스가 존재할 수 있다.

넌클러스터 인덱스

테이블에 저장된 데이터와 별개로 인덱스 페이지를 생성한다. 때문에 추가 공간이 필요하다.

클러스터와 반대로 데이터의 추가/삭제에 영향을 받지 않는다.
하지만 실제 데이터와 다르게 따로 정렬을 해주고 조회를 해야 한다는 점에서 클러스터보다 조회 속도가 느리다.

UNIQUE 제약조건을 걸어주면 넌클러스터 인덱스가 적용된다.


인덱스를 언제 어떻게 무엇을 써야 할까?

인덱스는 조회 성능을 위해 존재하지만, 추가 공간 필요한다거나 인덱스를 위한 추가 작업을 야기한다.
따라서 이 인덱스를 무작정 사용하면 안된다.

일단 기본적으로 하나의 테이블엔 하나의 ID 칼럼이 존재하고, 이를 PK 걸어주므로 클러스터 인덱스는 항상 존재한다고 생각할 수 있다.

그렇다면 언제 논클러스터 인덱스를 적용해야 할까?

  • 테이블의 규모가 큰 경우
  • 자주 조회되는 칼럼
  • 조건절(WHERE, JOIN, ORDER BY)에 자주 사용되는 칼럼
    조건절은 아무래도 ID가 아닌 칼럼에 자주 적용되며, 테이블에서 해당 조건에 맞는 데이터를 조회하는 작업이 우선적으로 필요하기에 적용되기 때문이다.

Reference

profile
newBlog == https://kdkdhoho.github.io

0개의 댓글