반응형

📖 인덱스(Index)란?

https://www.progress.com/tutorials/odbc/using-indexes

전공책을 공부할 때 시험 범위를 공부하기 위해 가장 먼저 하는 일은 무엇일까요?

바로 책 앞쪽에 있는 목차에서 시험 범위가 시작하는 부분의 페이지 번호를 알아내는 것입니다.

인덱스는 말 그대로 책의 맨 처음 혹은 맨 뒤에 있는 색인이라고 할 수 있습니다. 그렇다면 책에서의 내용은 데이터가 될 것이고 데이터가 저장된 레코드의 주소는 인덱스 목록에 있는 페이지 번호가 될 것입니다.

테이블에 데이터가 수백만 개 있다고 가정했을 때 1번부터 차례대로 원하는 데이터를 찾으려고 하면 시간이 오래 걸립니다. 이러한 문제를 해결하기 위해 인덱스가 생겨났고 인덱스를 통해 요청된 데이터를 빠르게 조회할 수 있게 됩니다.

즉, 인덱스(Index)란 데이터베이스 테이블에 대한 검색 동작 속도를 높여주는 자료구조입니다. 

 

 

📝 인덱스의 장단점

장점

  • 키 값을 통해 테이블에서 검색과 정렬 속도를 향상시킴
  • 전반적으로 시스템의 부하를 낮출 수 있음

단점

  • 인덱스를 생성하는 데 시간이 많이 소요됨
  • 데이터 변경이 자주 발생할 경우 추가적인 인덱스 관리 필요
  • 인덱스를 관리하기 위해 데이터베이스에 약 10% 정도의 저장공간이 필요

 

 

🔧 인덱스 관리

인덱스는 정렬된 상태로 유지되어야 원하는 값을 빠르게 조회할 수 있습니다. 그러나 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE 연산을 한다면 정렬된 상태가 깨지게 되므로 아래와 같은 규칙이 필요합니다

  • INSERT - 새로운 데이터에 인덱스 추가
  • UPDATE - 기존의 데이터의 인덱스를 사용하지 않고 새로운 데이터에 인덱스 추가
  • DELETE - 삭제하는 데이터의 인덱스를 사용하지 않음으로 처리

만약 인덱스가 걸려있는 컬럼에서 INSERT, UPDATE, DELETE가 빈번하다면 인덱스의 크기가 비대해져 성능이 떨어질 수 있습니다. 즉, 실제 데이터는 몇만 건에 불과한데 빈번한 삽입, 삭제, 업데이트로 인덱스가 몇십만 건에 이르게 될 수 도 있습니다.

 

 

🔎 인덱스의 자료구조

B-Tree

https://slenderankle.tistory.com/284

가장 보편적으로 사용되는 인덱스의 자료구조는 B-Tree입니다. 

B-Tree는 가장 위에 Root Block, 중간에 Branch Block, 그리고 맨 아래 Leaf Block으로 이루어져 있습니다.
브랜치 블록은 분기를 위한 목적으로 활용되며 다음 단계를 가리키는 포인터를 가지고 있습니다.
그리고 리프 블록은 인덱스를 구성하는 컬럼의 데이터와
해당 데이터를 가지고 있는 행 위치를 가리키는 레코드 식별자(RID)로 구성되어 있습니다. 
시간 복잡도는 O(logn)이지만 일치(=) 검색과 범위(<>)검색에 모두 적합한 자료구조입니다.

 

해시 테이블

https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%85%8C%EC%9D%B4%EB%B8%94

해시 테이블은 해시함수를 사용하여 키를 해시값으로 매핑하고, 이 해시값을 인덱스로 삼아 데이터를 Key와 함께 저장하는 자료구조입니다. (Key, Value)로 데이터들을 저장하며 시간 복잡도가 O(1)이기 때문에 매우 빠른 검색 능력을 보여줍니다.

하지만 Key값이 한 글자만 달라져도 해시값이 완전 다르게 매핑되므로 특정 단어로 시작하는 값, 일부분 검색, 부등호(<,>)와 같은 내용, 전방 일치 등등의 작업을 하고자 할 때는 해시 테이블이 적합하지 않습니다. 해시 테이블은 동등 연산(==)에 특화되어 있으며 주로 메모리 기반의 데이터베이스에 많이 사용됩니다.

 

반응형

+ Recent posts