본문 바로가기
데이터베이스

[SQLD] 데이터베이스 인덱스(Index) 왜 사용할까?

by 데이널 2023. 11. 24.

이번 포스팅에서는 데이터베이스 인덱스에 대해 알아보도록 하겠습니다. 인덱스 컬럼을 왜 만드는지 궁금하신 분들이라면 주목해 주세요. 보통 데이터베이스에서 많이 활용하는 인덱스는 B*Tree Index입니다. 그리고 가끔 Bitmap Index를 사용합니다. 저는 B*Tree Index를 중점적으로 설명하겠습니다. 
 

 

 

왜 Index가 필요할까?

우선 '인덱스가 왜 필요할까?'에 대한 해답은 검색 효율을 높이기 위해서입니다. 우리가 책을 구입하면 제일 처음에 목차를 보고 쉽게 해당 페이지로 이동할 수 있듯이  인덱스는 목차와 같은 역할을 합니다. RDBMS에서는 정렬된 순서로 인덱스 데이터를 구성하여 SELECT 할 때 해당 인덱스를 사용해 빠르게 데이터를 가져옵니다. 이 방식은 데이터량이 많을 때 빠른 검색을 도와 줍니다.
 

B-tree Index

"B*Tree"라는 용어는 "Balanced Tree"를 의미하며 Index를 구성할 때 양쪽으로 균형을 맞추는 구조로 만듭니다. 이런 방식은 다양한 쿼리에서 일관된 성능을 보장해줍니다. 그러면 B*Tree Index의 세가지 특징에 대해 살펴 보겠습니다. 
 

1. 균형 트리 구조

  • B*Tree Index는 그림처럼 Balanced Tree 구조입니다. 즉, 시간이 지나면서 데이터가 삽입(Insert)되거나 삭제(Delete)될 때에도 Tree의 균형을 유지하는게 중요합니다.  

2. 계층적 노드

  • Tree는 계층적 노드로 구성됩니다. 각 노드에는 하위 노드에 대한 특정 수의 키와 포인터가 포함되어 있습니다. 노드의 키 수는 특정 범위 내로 제한되어 키의 균형 잡힌 분배가 되게 처리됩니다. 아래 그림처럼 Root Block Branch Bock Leaf Bock 순으로 저장됩니다.

3. 정렬된 키

  • 각 노드 내의 키는 오름차순으로 정렬됩니다. 이러한 정렬된 배열은 이진탐색(Binary search) 기술을 사용하여 효율적인 검색이 가능하게 합니다. 그림을 참조하면, Node 당 다수 Row(값) 저장 가능합니다. 

 

B*Tree Index
B*Tree Index

 

비트맵(Bitmap) 인덱스

 

Bitmap 인덱스는 비트 벡터(Bit Vector)를 사용하여 값을 표현하는 방법입니다. 각 비트는 인덱싱된 열의 고유 값에 해당하며, 비트는 해당 행에 값이 있는지에 따라 설정되거나 설정 해제됩니다. RDBMS에서 자주 사용되는 인덱스는 아니지만 아래 사용 사례에서 주로 활용됩니다. 


사용 사례

  • 비트맵 인덱스는 성별 또는 상태 컬럼과 같이 카디널리티가 낮은 경우 효과적입니다. (낮은 카디널리티 컬럼. 즉,  몇 가지 고유 값이 존재할 때 사용)
  • boolean 조건 : 쿼리에 여러 OR 조건이 포함되는 부울 조건에 적합합니다.

 

Index는 무조건 좋을까?

우선 인덱스 사용의 목적은 '검색 성능의 최적화'하는데 있습니다. 하지만 검색 속도 향상을 위해 무분별하게 Index를 많이 추가하게 되면 그로 인해 문제가 발생합니다. 첫 번째 이슈는 Insert, Update, Delete 등과 같은 DML 작업은 테이블과 인덱스를 함께 변경이 이루어집니다. 그래서 많은 인덱스를 변경하다 보면 오히려 속도가 더 느려질 수 있기 때문입니다. 또한 Index도 데이터 공간을 차지합니다. Index를 너무 많이 만들면 Table보다 더 많은 데이터 공간을 차지하기도 합니다.
 
두 번째 이슈는 Index에 대한 이슈는 오랜 시간 사용하다보면 'Index Skew 현상'이 발생합니다. 왜도 현상이라고도 하는데, Index가 균형있게 구성되지 못하고 한쪽으로 치우친 형태가 되는 경우 입니다. 이렇게 되면 검색 성능이 저하되기 때문에 인덱스 재생성(Index Rebuild)가 필요합니다. 

 
왜도(skewness) : 데이터 분포의 좌우 비대칭도를 표현하는 척도입니다. 즉 데이터의 분포가 얼마나 대칭이 아닌지를 나타냅니다. 다음 그림과 같이 데이터의 분포가 왼쪽이나 오른쪽으로 얼마나 치우쳤는지에 대한 정도를 수치로 나타낼 수 있습니다. (출처 위키피디아) 

 

마무리

결론적으로 인덱스는 관계형 데이터베이스 시스템의 성능과 뗄수 없는 관계입니다. 많은 데이터베이스 시스템이 인덱스를 제대로 만들지 않아 검색 성능이 좋지 않은 경우를 다수 경험했습니다.

결국 성능 튜닝에서 인덱스 설계 부터 다시 하고 쿼리 튜닝을 들어가기도 합니다. 사용자들이 많이 사용하는 액세스 패스를 분석해서 인덱스 전략을 세우는 방식이죠. 인덱스는 다양한 쿼리 형태를 모두 지원 가능하게 꼼꼼히 설계해야 합니다.