📖 인덱스(Index)란?
전공책을 공부할 때 시험 범위를 공부하기 위해 가장 먼저 하는 일은 무엇일까요?
바로 책 앞쪽에 있는 목차에서 시험 범위가 시작하는 부분의 페이지 번호를 알아내는 것입니다.
인덱스는 말 그대로 책의 맨 처음 혹은 맨 뒤에 있는 색인이라고 할 수 있습니다. 그렇다면 책에서의 내용은 데이터가 될 것이고 데이터가 저장된 레코드의 주소는 인덱스 목록에 있는 페이지 번호가 될 것입니다.
테이블에 데이터가 수백만 개 있다고 가정했을 때 1번부터 차례대로 원하는 데이터를 찾으려고 하면 시간이 오래 걸립니다. 이러한 문제를 해결하기 위해 인덱스가 생겨났고 인덱스를 통해 요청된 데이터를 빠르게 조회할 수 있게 됩니다.
즉, 인덱스(Index)란 데이터베이스 테이블에 대한 검색 동작 속도를 높여주는 자료구조입니다.
📝 인덱스의 장단점
장점
- 키 값을 통해 테이블에서 검색과 정렬 속도를 향상시킴
- 전반적으로 시스템의 부하를 낮출 수 있음
단점
- 인덱스를 생성하는 데 시간이 많이 소요됨
- 데이터 변경이 자주 발생할 경우 추가적인 인덱스 관리 필요
- 인덱스를 관리하기 위해 데이터베이스에 약 10% 정도의 저장공간이 필요
🔧 인덱스 관리
인덱스는 정렬된 상태로 유지되어야 원하는 값을 빠르게 조회할 수 있습니다. 그러나 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE 연산을 한다면 정렬된 상태가 깨지게 되므로 아래와 같은 규칙이 필요합니다
- INSERT - 새로운 데이터에 인덱스 추가
- UPDATE - 기존의 데이터의 인덱스를 사용하지 않고 새로운 데이터에 인덱스 추가
- DELETE - 삭제하는 데이터의 인덱스를 사용하지 않음으로 처리
만약 인덱스가 걸려있는 컬럼에서 INSERT, UPDATE, DELETE가 빈번하다면 인덱스의 크기가 비대해져 성능이 떨어질 수 있습니다. 즉, 실제 데이터는 몇만 건에 불과한데 빈번한 삽입, 삭제, 업데이트로 인덱스가 몇십만 건에 이르게 될 수 도 있습니다.
🔎 인덱스의 자료구조
B-Tree
가장 보편적으로 사용되는 인덱스의 자료구조는 B-Tree입니다.
B-Tree는 가장 위에 Root Block, 중간에 Branch Block, 그리고 맨 아래 Leaf Block으로 이루어져 있습니다.
브랜치 블록은 분기를 위한 목적으로 활용되며 다음 단계를 가리키는 포인터를 가지고 있습니다.
그리고 리프 블록은 인덱스를 구성하는 컬럼의 데이터와
해당 데이터를 가지고 있는 행 위치를 가리키는 레코드 식별자(RID)로 구성되어 있습니다.
시간 복잡도는 O(logn)이지만 일치(=) 검색과 범위(<>)검색에 모두 적합한 자료구조입니다.
해시 테이블
해시 테이블은 해시함수를 사용하여 키를 해시값으로 매핑하고, 이 해시값을 인덱스로 삼아 데이터를 Key와 함께 저장하는 자료구조입니다. (Key, Value)로 데이터들을 저장하며 시간 복잡도가 O(1)이기 때문에 매우 빠른 검색 능력을 보여줍니다.
하지만 Key값이 한 글자만 달라져도 해시값이 완전 다르게 매핑되므로 특정 단어로 시작하는 값, 일부분 검색, 부등호(<,>)와 같은 내용, 전방 일치 등등의 작업을 하고자 할 때는 해시 테이블이 적합하지 않습니다. 해시 테이블은 동등 연산(==)에 특화되어 있으며 주로 메모리 기반의 데이터베이스에 많이 사용됩니다.
'💾Database' 카테고리의 다른 글
[Database] 데이터 무결성(Data Integrity)이란? (3) | 2021.12.13 |
---|---|
[Database] 데이터베이스 기본 용어 정리 (0) | 2021.11.29 |
[Database] 데이터베이스란? (0) | 2021.10.30 |
[Database] DBMS, RDBMS, SQL, NoSQL 용어 정리 (0) | 2021.10.13 |
[Database] 데이터베이스 정규화 (1NF, 2NF, 3NF) (0) | 2021.08.25 |