Computer Science

[DB] 데이터베이스 인덱스(Index)란 무엇인가?

emhaki 2023. 1. 30. 10:14
728x90
반응형
SMALL

아직까지 미미한 양의 DB를 다뤄보았기 때문에 데이터 양이 증가할수록 실행 속도가 눈에 띄게 느려지는 경험을 해보지는 못했다. 하지만 DB데이터의 양이 증가할수록 쿼리를 잘 사용해야하고, 쿼리의 성능을 높이는 데 중요한 것은 인덱스를 적재적소로 활용해야 함은 잘 알고 있다. 오늘은 인덱스의 개념과 구조, 그리고 필요성, 사용했을 때 장단점들에 대해 정리해보고자 한다.

인덱스(Index)란?

인덱스(Index)는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료구조이다. 테이블의 특정 컬럼(Column)에 인덱스를 생성하면, 해당 컬럼의 데이터를 정렬한 후 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 컬럼의 값과 물리적 주소를 (key, value)의 한 쌍으로 저장한다. 

 

인덱스를 조금 더 쉽게 이해하고자 책으로 비유하면 책에서의 목차라고 생각하면 된다. 책에서 원하는 내용을 찾을 때 목차를 이용하면 훨씬 빠르게 찾을 수 있는데, 마찬가지로 테이블에서 원하는 데이터를 찾기 위해 인덱스를 이용하면 빠르게 찾을 수 있다.

출처 : https://mangkyu.tistory.com/96

인덱스의 장단점

🔎 인덱스의 장점

인덱스의 장점으로는 앞에서 언급했듯이 테이블을 검색하는 속도와 성능이 향상된다. 또 그에 따라 시스템의 전반적인 부하를 줄일 수 있다. 인덱스는 데이터들이 정렬되어 있다는 특징 때문에 조건 검색이라는 영역에서 굉장한 장점이 된다.

 

기존엔 Where문으로 특정 조건의 데이터를 찾기 위해서 테이블의 전체를 조건과 비교해야 하는 '풀 테이블 스캔(Full Table Scan)'작업이 필요했는데 인덱스를 이용하면 데이터들이 정렬되어 있기 때문에 조건에 맞는 데이터를 빠르게 찾을 수 있다.

 

이로 인해 where 조건에 맞는 데이터들을 빠르게 찾아낼 수 있고, 이미 정렬되어 있기 때문에 ORDER BY의 의한 정렬 과정을 피할 수 있으며, MIN, MAX의 효율적인 처리가 가능하다.

🔎 인덱스의 단점

인덱스의 단점으로는 

1. 인덱스를 관리하기 위한 추가 작업이 필요

2. 추가 저장 공간 필요

3. 잘못 사용하는 경우 오히려 검색 성능 저하

등이 있다. 

 

1. 인덱스를 관리하기 위한 추가 작업이 필요

우리가 다루는 데이터는 새로운 값이 추가되거나, 수정되거나, 삭제되기도 한다. DB테이블에 변화가 생긴다면 인덱스 테이블 내에 있는 값들을 다시 정렬을 해야 한다. 그렇기 때문에 인덱스 테이블, 원본 테이블 이렇게 두 군데의 데이터 수정 작업을 해줘야 한다는 단점이 발생한다. 

 

2. 추가 저장 공간 필요

인덱스를 관리하기 위해서는 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요하다. 그렇기 때문에 무턱대고 인덱스를 만들어서는 안되며 속도 향상에 비해 단점들의 COST를 비교해서 인덱스를 만들지 말지 정해야 한다.

 

3. 잘못 사용하는 경우 오히려 검색 성능 저하

인덱스는 테이블의 전체 데이터 중에서 10 ~ 15% 이하의 데이터를 처리하는 경우에만 효율적이고 그 이상의 데이터를 처리할 땐 인덱스를 사용하지 않는 것이 더 낫다. 예를 들어 1개의 데이터가 있는 테이블과 100만 개의 데이터가 들어 있는 테이블이라면 100만 개의 데이터가 들어있는 테이블에는 풀 스캔보다는 인덱스 스캔이 더 유리하겠지만, 1개의 데이터가 들어있는 테이블은 굳이 인덱스 스캔 없이 풀 스캔이 빠를 것이다.

인덱스 자료구조

인덱스는 여러 자료구조를 이용해서 구현할 수 있는데, 대표적으로 해시 테이블(Hash Table)과 B+Tree가 있다.

 

1. 해시 테이블(Hash Table)

해시 테이블은 key와 value를 한 쌍으로 데이터를 저장하는 자료구조이다. (key, Value)로 쌍을 표현하며, key 값을 이용해 대응되는 value값을 구하는 방식이다. 해시 충돌이라는 변수가 존재하지만 평균적으로 O(1)의 매우 빠른 시간만에 원하는 데이터를 탐색할 수 있는 구조이다.

 

하지만 해시 테이블은 실제로 인덱스에서 잘 사용되지 않는데, 그 이유로는 해시 테이블이 등호(=) 연산에 최적화되어있기 때문이다. 데이터베이스에선 부등호연산이 자주 사용되는데, 해시 테이블 내의 데이터들은 정렬되어 있지 않으므로 특정 기준보다 크거나 작은 값을 빠른 시간 내에 찾을 수가 없다.

 

2. B+Tree

B-Tree 예시 (출처:https://rebro.kr/167)

기존의 B-Tree는 어느 한 데이터의 검색은 효율적이지만, 모든 데이터를 한 번 순회하는데에는 트리의 모든 노드를 방문해야 하므로 비효율적이다. 이러한 B-Tree의 단점을 개선시킨 자료구조가 B+Tree이다.

B+Tree 예시 (출처:https://rebro.kr/167)

B+ Tree는 오직 leaf node에만 데이터를 저장하고 leaf node가 아닌 node에서는 자식 포인터만 저장한다. 그리고 leaf node끼리는 Linked list로 연결되어 있다.

또, B+Tree에서는 반드시 leaf node에만 데이터가 저장되기 때문에 중간 node에서 key를 올바르게 찾아가기 위해서 key가 중복될 수 있다. 

🔎 B+Tree 장점

B+Tree의 장점을 요약하면 아래와  같다.

1. leaf node를 제외하고 데이터를 저장하지 않기 때문에 메모리를 더 확보할 수 있다. 따라서 하나의 node에 더 많은 포인터를 가질 수 있기 때문에 트리의 높이가 더 낮아지므로 검색 속도를 높일 수 있다.

 

2. Full scan을 하는 경우 B+Tree는 leaf node에만 데이터가 저장되어 있고, leaf node끼리 linked list로 연결되어 있기 때문에 선형 시간이 소모된다. 반면 B-Tree는 모든 node를 확인해야 한다. 

 

B+Tree를 사용하는 이유는 해시 테이블에서  언급했듯이 인덱스 컬럼은 부등호를 이용한 순차 검색 연산이 자주 발생할 수 있는데 B+Tree의 Linked list를 이용하면 순차 검색을 효율적으로 할 수 있게 된다.

📚 Reference

 

[DB] 11. 인덱스(Index) - (1) 개념, 장단점, B+Tree 등

[목차] 1. 인덱스(Index)란? 2. 인덱스(Index)의 장단점 3. 인덱스를 사용하면 좋은 경우 4. 인덱스의 자료 구조 1. 인덱스(Index)란? 인덱스(Index)는 데이터베이스의 테이블에 대한 검색 속도를 향상시켜

rebro.kr

 

[DB] 데이터베이스(DB) 인덱스(Index) 란 무엇인가?

들어가면서.. DB를 사용하면서 데이터의 양(row)에 따라 실행 결과의 속도가 차이가 나는 것을 알고 있었다. 특히 데이터의 양이 증가할수록 실행 속도는 느려지고, JOIN이나 서브 쿼리 사용 시 곱

choicode.tistory.com

728x90
반응형