Database - index에 대해서

9 June 2020 · 1 minute read

index는 데이터베이스(이하 DB)에 순차적으로 저장된 레코드를 빠르게 찾기 위한 자료구조다. DB 내부 엔진마다 구현된 내용은 다르겠지만, 일반적인 관계형 DB의 index는 B+트리 구조로 되어있다.

레코드와 index가 물리적으로 저장되는 방식에 따라 index는 Clustered index, Non-clusterd index 두 종류로 나뉜다.

Clustered index

Clustered index는 하나의 테이블이 하나만 가질 수 있는 index인데, 이 index의 순서에 따라 실제로 레코드가 함께 저장된다. 테이블의 PK index가 이에 해당된다.

Non-clustered index

index가 레코드가 저장되는 공간과 별도의 공간에 저장되며 테이블은 여러 개의 non-clustered index를 가질 수 있다. index는 레코드가 저장된 페이지1 참조를 가지고 있고, 이를 통해 레코드를 찾아갈 수 있다.

index의 동작 방식

어떤 컬럼에 index가 추가되어 있다면, 해당 컬럼이 where절의 조건으로 들어가면 DB의 쿼리 분석기는 이 컬럼의 index를 조회하게 된다. B+트리로 되어 있고 일반적인 index의 B+트리 깊이는 3~4단계이므로 페이지 참조를 빠르게 찾을 수 있다. 마지막 리프 노드에 도달하게 되면 찾고자 하는 페이지가 아니라면 리프는 리스트 구조로 연결되어 있기 때문에 상위 노드로 가지 않고 바로 다음 리프의 참조로 건너뛸 수 있다.

만약 where절 조건의 컬럼에 index가 없다면 테이블의 모든 레코드를 순차적으로 조회(Seq scan)해야 하며, 읽기 비용이 증가하게 된다. 그렇다고 모든 컬럼에 index를 생성하게 되면, 삽입, 갱신, 삭제 작업시 index를 생성한 개수만큼 쓰기 추가 비용이 발생하게 된다.


  1. DB에서 실제로 레코드가 저장되는 단위이다. 일반적으로 약 4kb 크기를 가지며 이 단위로 한번에 읽기와 쓰기 작업이 일어난다. ↩︎

Updated 9 June 2020