본문 바로가기

데이터베이스

[데이터베이스] 인덱스란 무엇인가?

인덱스란?

데이터베이스에서의 조회 성능을 끌어올려주기 위한 기능이다.

인덱스란 직역 하면 색인인데 즉, 원하는 빠르게 데이터를 찾기 위해 먼저 찾아보는 목차 같은 느낌이다.

 

인덱스가 없는 경우에는 FTS(Full Table Scan)로 데이터베이스의 모든 항목을 순차적으로 스캔하여 원하는 데이터를 찾는다. 듣기만 해도 오래 걸릴 거 같은 방식이다.

인덱스 알고리즘

B-Tree ( Balanced Tree )

인덱스 종류

클러스터링 인덱스

데이터베이스의 실제 데이터 자체가 정렬되고 그에 대한 인덱스가 생성되는 방식이다.

얘는 실제 데이터는 하나이기 때문에 클러스터링 인덱스 또한 테이블 당 하나씩만 존재한다.

보통은 Primary Key 필드에 자동으로 생성된다.

 

15를 찾는 상황이 있다. 인덱스 중 10에 접근해서 10 테이블에서 바로 15를 찾는다. 그리고 이 값이 실제 데이터이다.

논클러스터링 인덱스

기본키가 아닌 다른 필드에 생성되는 인덱스는 논클러스터링 인덱스이다.

실제의 데이터가 아닌 실제 데이터로 갈 수 있는 매핑 값과 함께 별도의 인덱스 테이블이 생성되는 방식이다.

실제 데이터로 가는  매핑 값은 보통 클러스터링 인덱스의 값이 이용된다.

 

예를 들어서 확인해보자. ab의 데이터를 조회하는 상황이라 가정해 보자. 먼저 논클러스터링 인덱스를 통해 a -> ab를 찾는다. 그리고 실제 ab의 데이터를 찾기 위해 같이 매핑되어 있는 클러스터링 인덱스의 값인 15를 클러스터링 인덱스에서 다시 조회한다. 그러면 최종적으로 실제 데이터값을 찾을 수 있다.

인덱스의 단점

데이터베이스의 조회 성능을 향상시켜준다는데 좋은 거 아닌가? 싶을 수 있는데 단점이 분명 존재한다. 단점을 알아보고 현 상황과 저울질을 하며 필요한 인덱스만을 사용해야 최고의 퍼포먼스가 나온다.

 

첫 번째 단점으로는, 인덱스는 데이터베이스 공간을 추가로 차지한다. 별도의 인덱스 영역이 생성되어야 하기 때문인데 평균적으로 데이터베이스 크기의 10% 정도는 차지하는 거 같다.

두 번째 단점으로는, 인덱스는 조회성능을 끌어올려주는 것은 맞지만 그 외의 INSERT, UPDATE, DELETE 연산의 비용이 증가한다. 인덱스가 없을 때는 실 데이터에만 반영을 하던 연산들이 인덱스가 생기면서 인덱스에도 함께 반영을 해줘야 하기 때문이다. 특히 페이지 단위로 나누어져 있는 인덱스 특성상 INSERT와 같은 연산은 페이지를 재분배해야 하는 일도 생기기에 속도가 느려진다.

 

인덱스를 사용하면 좋은 상황

직전 알아본 인덱스의 단점을 보면 알 수 있는데, 삽입/수정/삭제 연산이 빈번하게 일어나는 테이블에는 인덱스가 오히려 성능 저하로 이루어질 수 있다. 인덱스를 생성하기 가장 좋은 상황은 데이터의 변화는 적고 조회가 많이 일어나는 테이블이다.

 

WHERE 조건절에 자주 사용되는 필드

카디널리티가 높은 필드